如何识别Google OAuth2用户?
-
25-10-2019 - |
题
我使用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.
“这是谁?”本质上是一项服务;您必须要求访问它 范围 然后向Google个人资料提出请求 资源服务器 获得身份。看 OAuth 2.0登录 有关细节。
Altough JWT可以通过公共密钥在本地验证(Google APIS客户端库下载并自动缓存他们的公共密钥)通过 https://www.googleapis.com/oauth2/v1/tokeninfo 端点是必须检查应用程序以来是否已撤销了该应用程序的访问权限。
Java版本