我使用Facebook登录来识别用户。当新用户到达时,我将其用户ID存储在数据库中。下次他们来时,我认识到他们的Facebook ID,我知道数据库中的哪个用户。

现在,我正在尝试使用Google的OAuth2做同样的事情,但是如何识别用户?

Google向我发送了几个代码和令牌(access_token,id_token,refresh_token),但是它们都不是恒定的。这意味着如果我在2分钟后注销并登录,则所有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
)

该解决方案来自该线程: https://groups.google.com/forum/#!/google-api-php-client/o1brsq9nvuq/xa532mxegfij

其他提示

正如其他人提到的那样,您可以发送到 https://www.googleapis.com/oauth2/v3/userinfo, ,使用您刚收到的OAuth2携带者令牌,您将获得有关用户(ID,名称等)的一些信息的回复。

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

OpenID Connect 是OAuth2顶部的身份验证层。交换授权时 code 在Google的令牌端点,您将获得一个访问令牌( access_token 参数)以及OpenID连接ID令牌( id_token 范围)。

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

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

如评论中所述,这些令牌与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
}

也有各种编程语言的库来编程解码JWT。

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

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

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

Google Dev OpenID连接UserInfo

“这是谁?”本质上是一项服务;您必须要求访问它 范围 然后向Google个人资料提出请求 资源服务器 获得身份。看 OAuth 2.0登录 有关细节。

Altough JWT可以通过公共密钥在本地验证(Google APIS客户端库下载并自动缓存他们的公共密钥)通过 https://www.googleapis.com/oauth2/v1/tokeninfo 端点是必须检查应用程序以来是否已撤销了该应用程序的访问权限。

Java版本

oauth2sample.java

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top