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.
小智 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
bla*_*ang 13
应该提到的是,OpenID Connect API id
不再返回任何属性.
它现在是sub
用作唯一用户标识的属性.
请参阅Google Dev OpenID Connect UserInfo
归档时间: |
|
查看次数: |
53155 次 |
最近记录: |