Как проверить токен доступа API аутентификации Google? - PullRequest
94 голосов
/ 11 декабря 2008

Как проверить токен доступа для аутентификации Google?

Мне нужно как-то запросить Google и спросить: действителен ли [данный токен доступа] для [example@example.com] учетной записи Google?

Короткая версия :
Понятно, как токен доступа, предоставляемый через Аутентификация Google Api :: OAuth для веб-приложений , может использоваться для запроса данных из ряда служб Google. Не ясно, как проверить, является ли данный токен доступа действительным для данной учетной записи Google. Я хотел бы знать, как.

Длинная версия :
Я разрабатываю API, который использует аутентификацию на основе токенов. Токен будет возвращен при предоставлении действительного имени пользователя + пароля или при предоставлении стороннего токена из любой из N проверяемых служб.

Одним из сторонних сервисов будет Google, позволяющий пользователю проходить аутентификацию на моем сервисе, используя свою учетную запись Google. Позже это будет расширено, чтобы включить учетные записи Yahoo, доверенных поставщиков OpenID и т. Д.

Схематический пример доступа на основе Google:

альтернативный текст http://webignition.net/images/figures/auth_figure002.png

Сущность 'API' находится под моим полным контролем. Объект «открытый интерфейс» - это любое веб-приложение или приложение для настольного компьютера. Некоторые публичные интерфейсы находятся под моим контролем, другие не будут, а другие, о которых я, возможно, даже не узнаю.

Поэтому я не могу доверять токену, предоставленному API на шаге 3. Он будет предоставлен вместе с соответствующим адресом электронной почты учетной записи Google.

Мне нужно как-то запросить Google и спросить: Этот токен доступа действителен для example@example.com?

В этом случае example@example.com является уникальным идентификатором учетной записи Google - адресом электронной почты, который кто-то использует для входа в свою учетную запись Google. Нельзя считать, что это адрес Gmail - кто-то может иметь учетную запись Google без учетной записи Gmail.

В документации Google четко указано, как с помощью токена доступа можно получать данные из ряда служб Google. Ничто не говорит о том, как вы можете проверить, является ли данный токен доступа действительным с самого начала.

Обновление Токен действителен для N сервисов Google. Я не могу использовать токен для службы Google в качестве средства проверки, поскольку я не буду знать, какое подмножество всех служб Google на самом деле использует данный пользователь.

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

Ответы [ 10 ]

105 голосов
/ 09 июля 2014

Для проверки пользователя просто оставьте сообщение получить токен доступа как accessToken и опубликовать его и получить ответ

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

Вы также можете попробовать в адресной строке в браузерах, использовать httppost и ответ в Java также

ответ будет как

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

Область действия - это предоставленное разрешение accessToken. Вы можете проверить идентификаторы области в этой ссылке

19 голосов
/ 08 мая 2012
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}
17 голосов
/ 26 мая 2017

вы можете проверить токен доступа аутентификации Google, используя эту конечную точку:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

Это проверяющая конечная точка Google V3 OAuth AccessToken, вы можете обратиться к документу Google ниже: (В OAUTH 2.0 ENDPOINTS Tab)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token

4 голосов
/ 02 августа 2016

Хорошо, большинство ответов верны, но не совсем верны. Идея JWT заключается в том, что вы можете проверять токен без необходимости каждый раз связываться с эмитентом. Необходимо проверить идентификатор и проверить подпись токена с помощью известного открытого ключа сертификата, который Google использовал для подписи токена.

См. Следующий пост, почему и как это сделать.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/

3 голосов
/ 23 июля 2015

Ответ потока кода oauth Google в дополнение к access_token также возвращает id_token, который содержит полезную для проверки информацию в зашифрованном виде.

Одна вещь, которая делает идентификационные токены полезными, это тот факт, что вы можете передать их вокруг различных компонентов вашего приложения. Эти компоненты могут использовать идентификационный токен как легкий механизм аутентификации приложение и пользователь. Но прежде чем вы сможете использовать информацию в удостоверении личности токен или полагаться на него как на утверждение, что пользователь прошел аутентификацию, Вы должны подтвердить это.

Проверка токена ID требует нескольких шагов:

  • Убедитесь, что ID-токен - это JWT, который правильно подписан соответствующим открытым ключом Google.
  • Убедитесь, что значение aud в токене идентификатора равно идентификатору клиента вашего приложения.
  • Убедитесь, что значение iss в токене идентификатора равно account.google.com или https://accounts.google.com.
  • Убедитесь, что время истечения (exp) идентификатора токена не прошло.
  • Если вы передали параметр hd в запросе, убедитесь, что у идентификатора токена есть утверждение hd, соответствующее вашему размещенному домену Google Apps.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken ссылка содержит примеры кода для проверки токенов ID.

См. Также https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth.

1 голос
/ 12 января 2009

Мне нужно как-то запросить Google и спросить: действителен ли этот токен доступа для example@example.com?

Нет. Все, что вам нужно, это запросить стандартный вход в систему с помощью Федеративный вход для пользователей учетной записи Google из вашего домена API. И только после этого вы можете сравнить «постоянный идентификатор пользователя» с идентификатором из «открытого интерфейса».

Значение области используется на странице входа в систему Google Federated Login для идентификации запрашивающего сайта для пользователя. Он также используется для определения значения постоянного идентификатора пользователя, возвращаемого Google.

Таким образом, вы должны быть из того же домена, что и «открытый интерфейс».

И не забывайте, что пользователь должен быть уверен, что вашему API можно доверять;) Поэтому Google спросит пользователя, позволяет ли он проверить его личность.

0 голосов
/ 13 июля 2015

Вот пример использования Guzzle :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}
0 голосов
/ 29 августа 2009

Произвольный токен доступа OAuth не может использоваться для аутентификации, поскольку значение токена находится за пределами спецификации OAuth Core. Он может быть предназначен для однократного использования или для ограничения срока действия, или может предоставлять доступ, который пользователь не хочет предоставлять. Он также непрозрачен, и получатель OAuth, который его получил, мог никогда не увидеть какой-либо идентификатор пользователя.

Поставщик услуг OAuth и один или несколько потребителей могут легко использовать OAuth для предоставления проверяемого токена аутентификации, и есть предложения и идеи для этого, но произвольный поставщик услуг, говорящий только на OAuth Core, не может обеспечить это без другая координация с потребителем. Специфичный для Google метод REST AuthSubTokenInfo вместе с идентификатором пользователя близок, но он также не подходит, поскольку он может сделать недействительным токен, или срок действия токена может истечь.

Если ваш Google ID является идентификатором OpenId, а ваш "открытый интерфейс" является либо веб-приложением, либо может вызывать браузер пользователя, то вам, вероятно, следует использовать OP OpenID от Google.

OpenID состоит из простой отправки пользователя в OP и получения подписанного подтверждения обратно. Взаимодействие исключительно в интересах РП. Не существует долгоживущего токена или другого пользовательского дескриптора, который мог бы использоваться для указания того, что RP успешно аутентифицировал пользователя с помощью OP.

Одним из способов проверки предыдущей аутентификации по идентификатору OpenID является повторное выполнение аутентификации при условии, что используется тот же пользовательский агент. OP должен иметь возможность вернуть положительное утверждение без взаимодействия с пользователем (например, путем проверки файла cookie или сертификата клиента). OP может свободно требовать другого взаимодействия с пользователем, и, вероятно, будет, если запрос на аутентификацию поступает из другого домена (мой OP дает мне возможность повторно аутентифицировать этот конкретный RP без взаимодействия в будущем). А в случае Google пользовательский интерфейс, через который пользователь прошел, чтобы получить токен OAuth, может не использовать тот же идентификатор сеанса, поэтому пользователю придется повторно пройти аутентификацию. Но в любом случае вы сможете подтвердить свою личность.

0 голосов
/ 26 февраля 2009

Попробуйте сделать запрос с аутентификацией OAuth, используя свой токен для https://www.google.com/accounts/AuthSubTokenInfo. Это задокументировано только для работы с AuthSub, но также работает и для OAuth. Он не скажет вам, для какого пользователя предназначен токен, но сообщит, для каких сервисов он действителен, и запрос не будет выполнен, если токен недействителен или был отозван.

0 голосов
/ 10 января 2009

Google никогда не сможет ответить на ваш вопрос, потому что это не "этот токен доступа действителен?" Это жетон + секрет.

...