Проверка подлинности браузера через HttpURLConnection - PullRequest
7 голосов
/ 28 февраля 2012

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

Шаг 1. Создание токена запроса

Начните с вызова API нового метода токена.Это вернет новый токен запроса, который будет действителен в течение 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<String, List<String>> headerFields = connection.getHeaderFields();
String callBackUrl = null;
for(Map.Entry<String, List<String>> 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<String, List<String>> 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]

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

Неправильно ли я выполняю аутентификацию?

Я действительно ценю ваше предложение.

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

1 Ответ

3 голосов
/ 18 апреля 2012

Я не знаком с TmDB, но я прочитал эту страницу в процессе их аутентификации пользователей, и я думаю, что вы неправильно поняли.

Они специально говорят, что они не хотите, чтобы сторонние приложения сохраняли учетные данные имени пользователя / пароля, или передавали их в запросе («Преимущество этой системы заключается в том, что мы никогда не передаем имя пользователя или пароль пользователя по воздуху или не требуем стороннее приложение для хранения»).это локально ").Страница в callbackUrl - это не то, что вы, стороннее приложение, должны публиковать;это для использования человеком.Пользователь видит эту страницу, которая спрашивает: «Вы хотите предоставить доступ к [имя стороннего приложения]? Если это так, войдите в систему здесь».Ваше приложение не может контролировать этот процесс;он намеренно отделен от вас, поэтому вы никогда не сможете перехватить или сохранить учетные данные пользователя.Как только пользователь одобрит вас, вы сможете получить непрозрачный токен (идентификатор сеанса), который вы используете вместо учетных данных.

Это в основном та же идея, что и у трехстороннего OAuth;Основное отличие состоит в том, что OAuth требует некоторых дополнительных полей и вычисления подписи, так что это проще.Но это не имеет ничего общего с HTTP BasicAuth.

Я считаю, что вы хотите сделать следующее:

  1. Выполните шаг 1, так же, как вы делаете.Но не просто захватывайте заголовок Authentication-Callback;также проанализируйте JSON-ответ и получите значение «request_token».

  2. Проверьте, авторизовал ли вас пользователь, вызвав новый сеансовый API , передавКлюч API снова вместе с ранее полученным «request_token».Если вы получили успешный ответ с помощью «session_id», вы уже авторизованы и можете пропустить остальные шаги.

  3. В противном случае перенаправьте пользователя (или откройте браузер, если выВы уже не в одном) на URL, указанный в Authentication-Callback.

  4. Теперь, поскольку процесс входа в систему / утверждения отделен от вашего приложения, как вы узнаете, когда оно завершится?Документация по этому вопросу неясна и не описывает какого-либо способа получения уведомления об этом (или перенаправления TMDb обратно в ваше приложение).Может случиться так, что вам нужно просто опросить результат (то есть вернуться к шагу 2) через некоторый разумный интервал.

...