如何识别Google OAuth2用户?

我使用Facebooklogin来识别用户。 当新用户来到时,我将他们的用户ID存储在我的数据库中。 下一次他们来了,我认出了他们的Facebook ID,并且知道哪个用户在我的数据库中。

现在我正在尝试使用Google的OAuth2做同样的事情,但是我怎样才能识别用户呢?

Google向我发送了几个代码和令牌(access_token,id_token,refresh_token),但是没有一个是常量。 意思是如果我在2分钟后注销并重新login,则所有3个值都已更改。 我怎样才能唯一识别用户?

我正在使用他们的PHP客户端库: https : //code.google.com/p/google-api-php-client/

我把这个方法插入到google-api-php-client / src / apiClient.php中:

public function getUserInfo() { $req = new apiHttpRequest('https://www.googleapis.com/oauth2/v1/userinfo'); // XXX error handling missing, this is just a rough draft $req = $this->auth->sign($req); $resp = $this->io->makeRequest($req)->getResponseBody(); return json_decode($resp, 1); } 

现在我可以打电话给:

 $client->setAccessToken($_SESSION[ 'token' ]); $userinfo = $client->getUserInfo(); 

它返回一个这样的数组(加上电子邮件,如果该范围已被请求):

 Array ( [id] => 1045636599999999999 [name] => Tim Strehle [given_name] => Tim [family_name] => Strehle [locale] => de ) 

解决scheme源自以下主题: https : //groups.google.com/forum/#! msg/ google-api-php- client/ o1BRsQ9NvUQ/xa532MxegFIJ

正如其他人所提到的,您可以使用刚接收到的OAuth2载体令牌向https://www.googleapis.com/oauth2/v1/userinfo发送GET,您将收到一些关于该用户的信息(ID ,名字等)。

另外值得一提的是,Google实现了OpenID Connect ,而这个用户信息端点只是其中的一部分。

OpenID Connect是OAuth2之上的身份validation层。 在Google令牌端点交换授权code时,您将获得一个访问令牌( access_token参数)以及一个OpenID Connect ID令牌( id_token参数)。

这两个令牌都是JWT (JSON Web Token, http://tools.ietf.org/html/draft-ietf-oauth-json-web-token )。

如果你解码他们,你会得到一些断言,包括用户的ID 。 如果您将此ID链接到数据库中的用户,则可以立即识别它们,而无需执行额外的userinfo GET(节省时间)。

正如评论中所述,这些令牌是使用Google私钥签名的,您可能需要使用Google的公钥( https://www.googleapis.com/oauth2/v1/certs )validation签名,以确保它们是真实的。

您可以通过在https://jwt.io/ (向下滚动查看JWTdebugging器)来查看JWT中的内容。 断言看起来像这样:

 { "iss":"accounts.google.com", "id":"1625346125341653", "cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com", "aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com", "token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA", "iat":1567923785, "exp":1350926995 } 

还有用于编程式解码JWT的各种编程语言的库。

应该提到的是,OpenID Connect API不再返回id属性。

现在是用作唯一用户标识的sub属性。

请参阅Google Dev OpenID Connect UserInfo

“这是谁?” 本质上是一种服务; 您必须以范围请求访问权限,然后向Google个人资料资源服务器请求身份。 有关详细信息,请参阅OAuth 2.0进行login 。

Java版本

OAuth2Sample.java

尽pipeJWT可以通过公钥在本地validation(Google API客户端库自动下载并caching公钥),但需要通过https://www.googleapis.com/oauth2/v1/tokeninfoterminal在Google端检查令牌检查自应用程序创build以来应用程序的访问是否已被撤销。;