Аутентификация браузера через HttpURLConnection

В настоящее время я работаю над реализацией TMDb API. Есть метод под названием Аутентификация пользователя. Я успешно реализовал Шаг 1

Шаг 1: Генерируем токен запроса

Начните с вызова API метода new token. Это вернет новый токен запроса, который будет действителен в течение 60 минут. Токен запроса на этом этапе пользователь не авторизуется. Токены запроса API-аккаунта и являются связующим звеном между вашим приложением и пользователем на этапе 2.

Для шага 1 у меня есть следующий код:

URL url = new URL("http://api.themoviedb.org/3/authentication/token/new?api_key=the_key");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringWriter writer = new StringWriter();
String line;
while ((line = reader.readLine()) != null) {
    writer.write(line);
}
reader.close();
Map> headerFields = connection.getHeaderFields();
String callBackUrl = null;
for(Map.Entry> entry : headerFields.entrySet()) {
    if(entry.getKey() != null && entry.getKey().equals("Authentication-Callback")) {
        callBackUrl = entry.getValue().get(0);
    }
}

Он печатает url обратного вызова в консоли вместе с токеном запроса (если я конвертирую writer.toString() в объект Json).

Но вторая часть - это аутентификация пользователя по его имени пользователя и паролю. Обратный url перенаправляет пользователя на страницу входа в TMDb. Я проверил это, скопировав url обратного вызова из консоли в браузер.

Шаг 2 гласит:

Шаг 2: Запросить авторизацию у пользователя

Как только у вас есть действительный токен запроса, ваше приложение должно открыть веб-браузер и отправить их в TMDb. HTTP-ответ при генерации нового токена будет содержать заголовок Authentication-Callback, который вы можете легко использовать для перенаправления.

Если пользователь не вошел в TMDb, он будет перенаправлен на страницу входа в систему, прежде чем им будет предложено предоставить вашему приложению разрешение на использовать их учетную запись. После того как пользователь предоставит вашему приложению разрешение на использование своей учетной записи, браузерная часть этого закончится, и вы сможете вернуть пользователя в ваше приложение.

Как и в случае с запросом на новый токен, одобренный ответ будет включает заголовок Authentication-Callback, который, опять же, является удобным способ перенаправить ваше приложение обратно к API и сгенерировать настоящий идентификатор сессии.

Теперь мой вопрос: если у меня есть имя пользователя и пароль, могу ли я аутентифицировать этого пользователя через HttpURLConnection или любым другим способом?

Я попробовал это:

url = new URL(callBackUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");        
BASE64Encoder encoder = new BASE64Encoder();
String usernamepassword = "myusername" + ":" + "mypassword";
String encodedAuthorization = encoder.encode(usernamepassword.getBytes());
connection.setRequestProperty("Authorization", "Basic "+ encodedAuthorization);
headerFields = connection.getHeaderFields();

for(Map.Entry> entry : headerFields.entrySet()) {
    System.out.println(entry.getKey() + " : " +entry.getValue());
}

Но в консоли я получил:

null : [HTTP/1.1 404 Not Found]
Status : [404 Not Found]
X-Frame-Options : [sameorigin]
Date : [Tue, 28 Feb 2012 08:30:17 GMT]
Vary : [Accept-Encoding]
X-Cascade : [pass]
Content-Length : [7835]
X-XSS-Protection : [1; mode=block]
Set-Cookie : [tmdb.session=BAh7CUkiD3Nlc3Npb25faWQGOgZFRiJFNGRkMjc5ODYwMjJmYWYwZDlmOGE5%0AOTVjY2E0NWFjMzhhYTRiOGFjOGJiYjQ5ZGFhNzExNDdkMGM4MWNhZGUyMEki%0ADWxhbmd1YWdlBjsARkkiB2VuBjsARkkiC2xvY2FsZQY7AEZJIgd1cwY7AEZJ%0AIg5sb2dnZWRfaW4GOwBGRg%3D%3D%0A; path=/; expires=Thu, 29-Mar-2012 08:30:17 GMT; HttpOnly]
Content-Type : [text/html;charset=utf-8]
Connection : [keep-alive]
Server : [nginx]

Как вы можете видеть:

Status : [404 Not Found]

Так что последняя процедура не принесла результатов.

Может я неправильно реализую аутентификацию?

Буду очень признателен за ваше предложение.

Заранее спасибо.

7
задан Tapas Bose 28 February 2012 в 09:06
поделиться