如何识别Google OAuth2用户?

Nat*_*n H 56 login google-api oauth-2.0

我使用Facebook登录来识别用户.当新用户到来时,我将他们的userID存储在我的数据库中.下次他们来的时候,我认出了他们的Facebook ID,我知道它在我的数据库中是哪个用户.

现在我想尝试使用Google的OAuth2,但我怎样才能识别用户?

Google向我发送了几个代码和令牌(access_token,id_token,refresh_token),但它们都不是常量.这意味着如果我在2分钟后退出并重新登录,则所有3个值都已更改.如何唯一标识用户?

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

Chr*_*e L 86

正如其他人所提到的,您可以使用您刚刚收到的OAuth2持票人令牌将GET发送到https://www.googleapis.com/oauth2/v3/userinfo,您将收到有关该用户的一些信息的回复(id ,名称等).

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

OpenID Connect是OAuth2之上的身份验证层.code在Google的令牌端点交换授权时,您将获得访问令牌(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/v3/certs)验证签名,以确保它们是真实的.

您可以通过粘贴它来查看JWT中的内容:https://jwt.io/(向下滚动以查看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
}
Run Code Online (Sandbox Code Playgroud)

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

PS:要获取Google的OpenID Connect提供商支持的最新网址和功能列表,您可以检查该网址:https://accounts.google.com/.well-known/openid-configuration.

  • 我不认为这完全准确.access_token不是JWT令牌, (9认同)
  • 好的,发现它:https://www.googleapis.com/oauth2/v1/certs我还应该指出,进行验证是绝对必要的,否则攻击者可以使用任何已注册的Google帐户轻松登录您的应用程序. (7认同)

小智 27

我将此方法插入到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);  
}
Run Code Online (Sandbox Code Playgroud)

现在我可以致电:

$client->setAccessToken($_SESSION[ 'token' ]);
$userinfo = $client->getUserInfo();
Run Code Online (Sandbox Code Playgroud)

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

Array
(
    [id] => 1045636599999999999
    [name] => Tim Strehle
    [given_name] => Tim
    [family_name] => Strehle
    [locale] => de
)
Run Code Online (Sandbox Code Playgroud)

该解决方案源于此主题:https://groups.google.com/forum/#! msg/google -api-php- client/ o1BRsQ9NvUQ/xa532MxegFIJ

  • 请注意,Google最近更改了响应,而`id_token`现在包含键"sub"中的静态标识符,而不是之前和上面示例中的键"id".AFAIK,这一变化是他们对OpenID Connect协议的解释.不幸的是,当我写这篇文章时,回答似乎有点随机:有时它是`id`,有时它是`sub`所以我需要支持它们. (7认同)

bla*_*ang 13

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

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

请参阅Google Dev OpenID Connect UserInfo

  • 不确定这是正确的。不管文档说明了什么,如果我重新启动我的身份验证服务器,清除缓存并重新登录,“子”是不同的。 (2认同)