Как определить пользователя Google OAuth2? - PullRequest
56 голосов
/ 29 ноября 2011

Я использовал логин Facebook для идентификации пользователей. Когда приходит новый пользователь, я сохраняю его userID в своей базе данных. В следующий раз, когда они придут, я узнаю их идентификатор в Facebook и знаю, кто он в моей базе данных.

Сейчас я пытаюсь сделать то же самое с OAuth2 от Google, но как я могу узнать пользователей?

Google отправляет мне несколько кодов и токенов (access_token, id_token, refresh_token), однако ни один из них не является постоянным. Это означает, что если я выйду из системы и вернусь через 2 минуты, все 3 значения изменились. Как я могу однозначно идентифицировать пользователя?

Я использую их клиентскую библиотеку PHP: https://code.google.com/p/google-api-php-client/

Ответы [ 6 ]

84 голосов
/ 22 октября 2012

Как уже упоминалось, вы можете отправить GET на https://www.googleapis.com/oauth2/v3/userinfo,, используя только что полученный токен OAuth2, и вы получите ответ с некоторой информацией о пользователе (идентификатор, имя и т. Д.).

Стоит также упомянуть, что Google реализует OpenID Connect и что эта конечная точка информации пользователя является лишь одной из его частей.

OpenID Connect - это уровень аутентификации поверх OAuth2. При обмене авторизацией code в конечной точке токена Google вы получаете токен доступа (параметр access_token), а также токен OpenID Connect ID (параметр id_token).

Оба эти токена JWT (веб-токен JSON, http://tools.ietf.org/html/draft-ietf-oauth-json-web-token).

Если вы расшифруете их, вы получите некоторые утверждения, включая id пользователя. Если вы свяжете этот идентификатор с пользователем в вашей БД, вы можете сразу же идентифицировать его, не прибегая к дополнительной GET-информации пользователя (экономит время).

Как упоминалось в комментариях, эти токены подписаны закрытым ключом Google, и вы можете проверить подпись с помощью открытого ключа Google (https://www.googleapis.com/oauth2/v3/certs), чтобы убедиться, что они подлинные.

Вы можете увидеть, что находится в JWT, вставив его в https://jwt.io/ (прокрутите вниз для отладчика JWT). Утверждения выглядят примерно так:

{
    "iss":"accounts.google.com",
    "id":"1625346125341653",
    "cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA",
    "iat":1567923785,
    "exp":1350926995
}

Существуют также библиотеки для различных языков программирования для программного декодирования JWT.

PS : чтобы получить обновленный список URL-адресов и функций, поддерживаемых поставщиком OpenID Connect Google, вы можете проверить этот URL: https://accounts.google.com/.well-known/openid-configuration.

26 голосов
/ 03 января 2012

Я вставил этот метод в google-api-php-client / src / apiClient.php:

public function getUserInfo() 
{
    $req = new apiHttpRequest('https://www.googleapis.com/oauth2/v1/userinfo');
    // XXX error handling missing, this is just a rough draft
    $req = $this->auth->sign($req);
    $resp = $this->io->makeRequest($req)->getResponseBody();
    return json_decode($resp, 1);  
}

Теперь я могу позвонить:

$client->setAccessToken($_SESSION[ 'token' ]);
$userinfo = $client->getUserInfo();

Возвращает массив, подобный этому (плюс электронное письмо, если эта область была запрошена):

Array
(
    [id] => 1045636599999999999
    [name] => Tim Strehle
    [given_name] => Tim
    [family_name] => Strehle
    [locale] => de
)

Решение возникло из этой темы: https://groups.google.com/forum/#!msg/google-api-php-client/o1BRsQ9NvUQ/xa532MxegFIJ

13 голосов
/ 14 ноября 2015

Следует отметить, что OpenID Connect API больше не возвращает атрибут id.

Теперь это атрибут sub, который служит уникальной идентификацией пользователя.

См. Google Dev OpenID Connect UserInfo

1 голос
/ 25 апреля 2015

Хотя JWT могут быть проверены локально с помощью открытого ключа (клиентская библиотека API Google загружает и кэширует их открытые ключи автоматически), проверяя токен на стороне Google через конечную точку https://www.googleapis.com/oauth2/v1/tokeninfo, чтобы проверить, требуется ли доступ для приложение было аннулировано с момента создания токена.

1 голос
/ 29 ноября 2011

"Кто это?" по сути это услуга; Вы должны запросить доступ к нему как scope , а затем сделать запрос к профилю Google сервер ресурсов , чтобы получить удостоверение. Подробнее см. OAuth 2.0 для входа в систему .

0 голосов
/ 25 мая 2012

Java версия

OAuth2Sample.java

...