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

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

Мне нужно как-то запросить Google и спросить: есть ли [данный токен доступа] для учетной записи Google [[email protected]]?

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

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

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

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

alt text http://webignition.net/images/figures/auth_figure002.png

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

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

Мне нужно как-то запросить Google и спросить: действительно ли этот токен доступа для [email protected]?

В этом случае [email protected] - уникальный идентификатор учетной записи Google - адрес электронной почты, который кто-то использует для входа в свою учетную запись Google. Это не может считаться адресом Gmail - у кого-то может быть учетная запись Google без учетной записи Gmail.

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

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

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

Ответ 1

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

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

вы также можете попробовать в адресной строке в браузерах, используйте httppost и response в 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. вы можете проверить идентификаторы области в эту ссылку

Ответ 2

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;
    }
}

Ответ 3

вы можете проверить токен доступа к аутентификации 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

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

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

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

Ответ 5

Мне нужно как-то запросить Google и спросить: действительно ли этот токен доступа для [email protected]?

Нет. Все, что вам нужно - это запросить стандартный вход с Federated Login для пользователей учетной записи Google из вашего домена API. И только после этого вы можете сравнить "постоянный идентификатор пользователя" с тем, который у вас есть из "открытого интерфейса".

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

Итак, вам нужно быть в том же домене, что и "открытый интерфейс".

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

Ответ 6

Попробуйте сделать правильный запрос и проверьте наличие недопустимого ответа на токен.

Ответ 7

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

Ответ 8

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

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

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

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

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

Ответ 9

Вот пример использования 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();
}

Ответ 10

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

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

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

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

Ответ 11

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