Создание входа по oauth с помощью Scribe

Я прочитал слишком много страниц и попробовал образцы писцов, но я упустил самый важный момент — что такое уникальный и постоянный идентификатор пользователя для аутентификации oauth?

Я хочу реализовать веб-сайт, на котором пользователь может войти в систему с помощью Google, FB, Twitter и т. д. Я ожидаю, что поток будет следующим:

  1. сервлет запрашивает у выбранного поставщика авторизации токен запроса
  2. сервлет создает URL-адрес авторизации и перенаправляет пользователя туда
  3. пользователь дает разрешение
  4. служба авторизации перенаправляет на обратный вызов и передает верификатор в качестве параметра
  5. сервлет обратного вызова запрашивает у поставщика авторизации токен доступа

Теперь я могу использовать этот токен доступа в API-интерфейсах провайдера, например, для просмотра Google Диска или публикации вредоносных твитов. Хорошо, но все, что я хочу, это получить какой-то идентификатор, который я могу сохранить в базе данных и связать его с учетной записью пользователя. Поэтому, когда пользователь придет в следующий раз, я смогу его узнать.

Я не думаю, что токен доступа — это то, что мне нужно. Я запускал примеры писцов, и это значение меняется с каждым вызовом.

Должен ли я найти какой-то провайдерский API, который возвращает логин пользователя и вызывать его каждый раз, когда он входит в систему? Мне не нравится эта идея, потому что это (на мой взгляд) дополнительное HTTP-соединение для каждого входа в систему. И, например, образец диска Google вернет кучу данных, когда мне нужно всего несколько символов. Я думаю, что я упускаю какой-то важный момент. Или это действительно так задумано?


person Leos Literak    schedule 14.01.2014    source источник
comment
openid.net/connect — интересная концепция, которая делает то, что я хочу.   -  person Leos Literak    schedule 23.01.2014


Ответы (1)


Токены непрозрачные. Они не содержат информации о пользователе. В этом случае все делают отдельную базу данных с [USER_ID, ACCESS_TOKEN], поэтому, когда пользователь входит в систему, вы можете получить его токен доступа. Если вы входите в несколько сервисов, возможно, вам также понадобится SERVICE_NAME, чтобы отделить токены Twitter от токенов Google.

Редактировать

OAuth не является протоколом аутентификации или входа в систему, он не был разработан как таковой, хотя вы можете получить идентификатор пользователя с помощью специальных расширений (Twitter возвращает user_id в ответе на токен доступа) или делает дополнительные запросы, это всегда будет взлом.

Возможно, для ваших нужд больше подходит OpenID (к сожалению, здесь вам не поможет scribe)

person Pablo Fernandez    schedule 17.01.2014
comment
Как мне сопоставить пользователя из какой-либо службы OAuth с его учетной записью (user_id)? Когда я запускал ваши образцы, я получал уникальный токен доступа для каждого вызова. Так что, похоже, мне нужно выполнить еще один запрос с его токеном доступа, чтобы найти идентификатор пользователя службы, я прав? - person Leos Literak; 17.01.2014
comment
Да, но я думаю, что ваше приложение имеет некоторую информацию о пользователе, который запрашивает аутентификацию. - person Pablo Fernandez; 17.01.2014
comment
Я видел несколько сайтов, где я мог зарегистрироваться через facebook, twitter, google и так далее. Они не знали меня заранее. И я мог бы использовать другой компьютер, чтобы снова войти в выбранную службу. Поэтому я ожидал, что они связывают созданного пользователя с каким-то идентификатором от провайдера OAuth. Я недоволен тем, что в протоколе отсутствует эта информация. Неэффективно выполнять запрос на добавление и загружать много данных только для того, чтобы взять из них одно слово. - person Leos Literak; 17.01.2014
comment
Есть ли другой способ получить постоянный идентификатор пользователя, который не зависит от файлов cookie, кроме как выполнить некоторый авторизованный запрос с токеном доступа, который возвращает идентификатор пользователя службы? - person Leos Literak; 19.01.2014
comment
Я не понимаю вопроса, не могли бы вы перефразировать? - person Pablo Fernandez; 20.01.2014
comment
Вы сказали, что у всех есть таблица с [USER_ID, ACCESS_TOKEN]. Но если я не получаю cookie в HTTP-запросе, я не знаю возвращающегося пользователя. Он инициирует вход OAuth, который возвращает мне новый токен доступа. Так что я все еще не могу сопоставить этого пользователя с его существующей учетной записью, верно? Так что же мне теперь делать, чтобы узнать его? Должен ли я использовать API провайдера (с токеном доступа), который вернет мне логин пользователя провайдера? - person Leos Literak; 20.01.2014