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

68

Как проверить токен доступа к аутентификации 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 на самом деле является тем, кем они говорят. Если есть еще один способ сделать это, я с удовольствием попробую.

  • 0
    О какой конкретной службе аутентификации идет этот вопрос (OAuth, AuthSub, Установленные приложения, ...)? Пожалуйста, предоставьте более подробную ссылку.
  • 0
    @Martin v. Löwis: служба «OAuth-аутентификация для веб-приложений» - я обновил начало вопроса, чтобы отразить это. Спасибо за указание на это!
Показать ещё 1 комментарий
Теги:
web-services
oauth
google-oauth
google-authentication

11 ответов

74

Для проверки пользователя просто отправьте сообщение получить токен доступа как 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. вы можете проверить идентификаторы области в эту ссылку

15
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;
    }
}
  • 0
    Да, это ожидаемый ответ.
  • 2
    Этот ответ почти все еще действителен. Issued_to, похоже, больше не устанавливается. developers.google.com/accounts/docs/...
6

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

3

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

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

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

1

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

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

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

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

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

0

Отклик в ответе кода 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.

0

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

Пользовательский токен доступа 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, может не использовать один и тот же идентификатор сеанса, поэтому пользователю придется повторно аутентифицировать. Но в любом случае вы сможете утверждать идентичность.

  • 0
    OpenID 2.0 был недавно объявлен устаревшим и отключен Google в пользу OpenID Connect на основе OAuth, который предоставляет проверяемые идентификаторы .
0

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

0

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

-1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню