如何validationGoogle身份validationAPI访问令牌?

我如何validationGoogle身份validation访问令牌?

我需要以某种方式查询Google并询问:[给定访问令牌]对于[example@example.com] Google帐户是否有效?

简短版本
很明显,如何使用通过Google身份validationAPI :: OAuth身份validationWeb应用程序提供的访问令牌,然后从一系列Google服务请求数据。 目前还不清楚如何检查给定的访问令牌对于给定的Google帐户是否有效。 我想知道如何。

长版本
我正在开发一个使用基于令牌的身份validation的API。 在提供有效的用户名+密码或从N个可validation服务中的任何一个提供第三方令牌时,将返回令牌。

其中一项第三方服务是Google,允许用户使用他们的Google帐户对我的服务进行身份validation。 这将在以后扩展到包括雅虎帐户,可信的OpenID提供商等。

基于Google的访问示意图示例:

替代文字http://webignition.nethttp://img.dovov.comfigures/auth_figure002.png

'API'实体完全在我的控制之下。 “公共界面”实体是任何基于networking或桌面的应用程序。 一些公共接口在我的控制之下,其他的则不在,而其他的我可能从来不知道。

因此,我无法相信在步骤3中提供给API的令牌。这将随相应的Google帐户电子邮件地址一起提供。

我需要以某种方式查询谷歌,并问: 这个访问令牌是有效的example@example.com

在这种情况下,example@example.com是Google帐户的唯一标识符 – 用户用于login其Google帐户的电子邮件地址。 这不能被认为是一个Gmail地址 – 有人可以有一个谷歌帐户,没有一个Gmail帐户。

Google文档清楚地说明了如何使用访问令牌从多个Google服务中检索数据。 没有什么似乎说明如何检查一个给定的访问令牌是否有效。

更新该令牌对N个Google服务有效。 我无法尝试使用Google服务的令牌作为validation方式,因为我不知道给定用户实际使用的所有Google服务的哪个子集。

此外,我永远不会使用Google身份validation访问令牌来访问任何Google服务,只是作为validation所谓的Google用户实际上是他们所说的人的手段。 如果还有其他的方法,我很乐意尝试。

对于用户检查,只需将访问令牌作为accessToken获取并发布并获取响应即可

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

你也可以在浏览器的地址栏中试试,也可以在java中使用httppost和response

反应就会像

 { "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的给定权限。 您可以在此链接中查看范围ID

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

您可以使用此端点validationGoogle身份validation访问令牌:

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

这是Google V3 OAuth AccessTokenvalidation端点,您可以参考下面的Google文档:(在OAUTH 2.0 ENDPOINTS选项卡中)

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

好吧,大多数答案是有效的,但不完全正确。 智威汤逊的想法是,您可以validation令牌,无需每次联系发卡机构。 您必须检查id并使用用于签署令牌的Google证书的已知公钥validation令牌的签名。

看下一篇文章为什么以及如何做到这一点。

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

我需要以某种方式查询谷歌,并问:这个访问令牌是有效的example@example.com?

不需要。所有您需要的是通过API域的Google帐户用户的联合login请求标准login。 只有在这之后,您才能将“永久性用户ID”与“公共界面”中的一个进行比较。

在Google联合login页面上使用领域的值来向用户标识请求的站点。 它也用于确定Google返回的持久用户标识的值。

所以你需要从“公共接口”来的域名。

不要忘记,用户需要确保你的API可以被信任;所以Google会询问用户是否允许你检查他的身份。

尝试做出有效的请求并检查无效的令牌响应。

尝试使用您的令牌https://www.google.com/accounts/AuthSubTokenInfo进行OAuthauthentication的请求。; 这只logging为AuthSub工作,但也适用于OAuth。 它不会告诉你哪个用户的令牌是为,但它会告诉你哪些服务是有效的,如果令牌无效或已被撤销,请求将失败。

任意OAuth访问令牌不能用于身份validation,因为该令牌的含义不在OAuth Core规范之内。 它可以用于单次使用或缩短到期时间窗口,或者可以提供用户不想提供的访问。 这也是不透明的,获得它的OAuth消费者可能从来没有见过任何types的用户标识符。

一个OAuth服务提供者和一个或多个消费者可以很容易地使用OAuth来提供一个可validation的authentication令牌,并且有提议和想法可以做到这一点,但是只有OAuth Core的任意服务提供者不能提供这个服务,与消费者协调。 特定于Google的AuthSubTokenInfo REST方法与用户标识符是相近的,但它也不合适,因为它可能使标记失效,或者标记可能过期。

如果您的Google ID是OpenId标识符,并且您的“公共界面”既可以是networking应用,也可以调用用户的浏览器,那么您应该使用Google的OpenID OP。

OpenID只是将用户发送给OP并获得签名的断言。 互动完全是为了RP的利益。 没有长寿命的令牌或其他用户特定的句柄可用于指示RP已经用OP成功authentication了用户。

validation之前使用OpenID标识符进行身份validation的一种方法是,只要使用相同的用户代理,就只需再次执行身份validation。 OP应该能够在没有用户交互的情况下返回肯定的断言(例如,通过validationcookie或客户端证书)。 OP可以自由地要求另一个用户交互,并且如果authentication请求来自另一个域(我的OP让我可以select重新authentication这个特定的RP而不在将来进行交互)。 在Google的情况下,用户通过获取OAuth令牌的UI可能不会使用相同的会话标识符,因此用户将不得不重新进行身份validation。 但无论如何,你将能够断言身份。

下面是一个使用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(); } 

除了access_token之外, Google oauth代码stream响应还返回包含对encryptionforms的validation信息有用的id_token

让令牌有用的一件事是,您可以将它们传递给应用程序的不同组件。 这些组件可以使用ID令牌作为对应用程序和用户进行身份validation的轻量级身份validation机制。 但是,在您可以使用ID令牌中的信息或依赖它作为用户已authentication的断言之前,您必须validation它。

validationID令牌需要几个步骤:

  • validationID令牌是使用适当的Google公钥正确签名的JWT。
  • validationID令牌中的aud值等于您的应用程序的客户端ID。
  • validationID令牌中的iss值是否等于accounts.google.com或https://accounts.google.com
  • validationID令牌的到期时间(exp)没有通过。
  • 如果您在请求中传递了hd参数,请validationID令牌的hd声明与您的Google Apps托pipe域匹配。

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken链接具有validationID令牌的代码示例。;

另见https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth

Google永远不能回答你的问题,因为它不是“这个访问令牌有效吗? 这是令人信服的秘密。