Как определить пользователя Google OAuth2?
Я использовал Facebook для идентификации пользователей. Когда приходит новый пользователь, я сохраняю его идентификатор пользователя в моей базе данных. В следующий раз, когда они придут, я узнал их идентификатор Facebook, и я знаю, какой пользователь он находится в моей базе данных.
Теперь я пытаюсь сделать то же самое с Google OAuth2, но как я могу узнать пользователей?
Google отправляет мне несколько кодов и токенов (access_token, id_token, refresh_token), однако ни один из них не является постоянным. Значение, если я выйду из системы и вернусь через 2 минуты позже, все 3 значения изменились. Как я могу однозначно идентифицировать пользователя?
Я использую их клиентскую библиотеку PHP: https://code.google.com/p/google-api-php-client/
Ответы
Ответ 1
Я вставил этот метод в 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
Ответ 2
Как уже упоминалось, вы можете отправить GET на https://www.googleapis.com/oauth2/v1/userinfo, используя токен-маркер OAuth2, который вы только что получили, и вы получите ответ с некоторой информацией о пользователе (id, имя и т.д.).
Также стоит упомянуть, что Google реализует OpenID Connect и что эта конечная точка информации пользователя является лишь ее частью.
OpenID Connect - это уровень аутентификации поверх OAuth2. При обмене авторизацией code
на конечной точке токена Google вы получаете токен доступа (параметр access_token
), а также токен идентификатора OpenID Connect (параметр id_token
).
Оба эти маркера JWT (JSON Web Token, http://tools.ietf.org/html/draft-ietf-oauth-json-web-token).
Если вы их декодируете, вы получите некоторые утверждения, в том числе id пользователя. Если вы связываете этот идентификатор с пользователем в своей БД, вы можете сразу их идентифицировать, не выполняя дополнительный пользовательский GET (экономит время).
Как упоминалось в комментариях, эти токены подписаны с закрытым ключом Google, и вы можете проверить подпись с помощью открытого ключа Google (https://www.googleapis.com/oauth2/v1/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.
Ответ 3
Следует отметить, что API OpenID Connect больше не возвращает атрибут id
.
Теперь атрибут sub
служит уникальной идентификацией пользователя.
См. Google Dev OpenID Connect UserInfo
Ответ 4
"Кто это?" по существу является сервисом; вам необходимо запросить доступ к нему как области действия, а затем отправить запрос на сервер ресурсов профиля Google, чтобы получить личность. Подробнее см. OAuth 2.0 для входа.
Ответ 5
Версия Java
OAuth2Sample.java
Ответ 6
Более высокие JWT могут быть проверены локально с открытым ключом (клиентская библиотека API Google API загружает и автоматически кэширует открытые ключи), проверяя токен на стороне Google с помощью Конечная точка https://www.googleapis.com/oauth2/v1/tokeninfo необходима, чтобы проверить, был ли отменен доступ для аппликации с момента создания токена.