如何识别Google OAuth2用户?

时间:2011-11-29 13:50:01

标签: 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/

6 个答案:

答案 0 :(得分:83)

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

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

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

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

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

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

您可以通过在https://jwt.io/粘贴JWT来查看JWT中的内容(向下滚动以查看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。

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

答案 1 :(得分:26)

我将此方法插入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
)

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

答案 2 :(得分:13)

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

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

请参阅Google Dev OpenID Connect UserInfo

答案 3 :(得分:1)

“这是谁?”本质上是一种服务;您必须以范围请求访问它,然后向Google个人资料资源服务器发出请求以获取该身份。有关详细信息,请参阅OAuth 2.0 for Login

答案 4 :(得分:1)

可以使用公钥在本地验证Altough JWT(Google API客户端库自动下载并自动缓存公钥)通过https://www.googleapis.com/oauth2/v1/tokeninfo端点检查Google端的令牌是否有必要检查是否有访问权限自创建令牌以来,applyaton已被撤销。

答案 5 :(得分:0)