我使用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/
答案 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)
答案 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)
Java版