2008-12-11 16 views
73

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

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

Короткая версия:
Это ясно, как маркер доступа подается через Google Authentication Api :: OAuth Authentication for Web Applications можно использовать для затем запрашивать данные из различных служб 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

Какие конкретные аутентификации обслуживание этот вопрос (OAut h, AuthSub, Установленные приложения, ...)? Пожалуйста, предоставьте более подробную ссылку. – 2008-12-11 15:06:59

+0

@Martin v. Löwis: служба аутентификации OAuth для веб-приложений. Я обновил начало вопроса, чтобы отразить это. Спасибо за указание на это! – 2008-12-11 15:26:12

+0

интересная статья о проверке ключа Google может дать больше информации http://groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7 – dotjoe 2008-12-31 18:04:32

ответ

-1

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

-1

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

1

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

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

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

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

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

0

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

0

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

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

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

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

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

+0

OpenID 2.0 был устаревшим и отключен Google в пользу OpenID Connect на основе OAuth который предоставляет [проверяемые идентификационные токены] (http://stackoverflow.com/a/31597027/603516). – Vadzim 2015-07-23 20:12:18

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

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

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

Область является данное разрешение доступаToken. Вы можете проверить области видимости идентификаторов в this link

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(); 
} 
2

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

Одна вещь, которая делает значки идентификатора полезными, заключается в том, что вы можете передать им по различным компонентам вашего приложения. Эти компоненты могут использовать токен 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.

3

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

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

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

9

вы можете проверить маркер доступа Google проверки подлинности с помощью этой конечной точки:

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

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

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