[英]How do I validate a client-side google+ login?
因此,按照此处的基本教程 ( https://developers.google.com/+/web/signin/javascript-flow ),您可以轻松地为 google 帐户添加客户端登录。
通过修改代码查询/people/me,如下:
function signinCallback(authResult) {
if (authResult['status']['signed_in']) {
gapi.auth.setToken(authResult);
gapi.client.load('plus','v1', function(){
var request = gapi.client.plus.people.get({
'userId': 'me'
});
request.execute(function(resp) {
console.log(resp);
});
});
}
您可以访问基本帐户信息; 用户 ID、图像、名称等。
您还有来自 oauth 登录名的有效访问令牌。
现在,除非您有一个完全客户端的应用程序,否则您将不得不通知服务器用户已登录,以获取该用户的应用程序数据。
我想要做的是 POST 到 /login/gauth {'access_token': ..., 'user_id': ....} 它将响应一个 auth cookie 并重定向回来; 除了现在我们有一个持久的本地身份验证令牌,我们可以用它来识别用户。
在服务器上,我需要做的是使用访问令牌访问相同的 REST api (/people/me),并验证它返回的用户 ID; 任何其他提供的信息都可以在客户端伪造。
问题是,我在服务器端找不到任何验证/使用访问令牌的方法。
我可以在服务器上设置一个新的 OAuth 登录,并执行仅服务器登录过程,但这相当复杂,而且考虑到我已经有一个有效的访问令牌,这似乎很浪费。
我如何使用它?
您可能想要使用https://developers.google.com/+/web/signin/server-side-flow 中概述的混合流程。 在此流程中,您的客户端执行的操作与现在大致相同,但您的客户端还会获得一个短期“代码”,它应该通过安全通道将其传递给服务器。 然后,服务器根据服务器验证这一点,以获得自己的访问(可能还有刷新)令牌。 这比客户端尝试发送 access_token 更安全,因为它减少了中间人可以利用它的窗口,并且只能使用一次,从而减少了机会。
接受的答案中的细节是正确的,但有一种更简单的方法,它只是含糊地暗示,而不是实际陈述,但如果您仔细阅读,它会出现在示例代码中。
关键是:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=TOKEN
当 TOKEN 是客户端访问令牌时。 这将返回一个像这样的 json 块:
{u'access_type': u'online',
u'audience': u'...',
u'expires_in': 3475,
u'issued_to': u'...', <--- The client ID; use this to verify access token
u'user_id': u'1234567890', <--- The unique google user id
u'scope': u'https://www.googleapis.com/auth/userinfo.profile')
请注意,这只是验证:
如果要查询有关用户的其他详细信息,则需要使用 OAuth 库之一。
在许多情况下,这可能足以唯一标识用户。
您可以通过验证服务器上用户 JWT id_token
的真实性,跳过向tokeninfo
端点发出网络请求。 这可以通过使用 Google 的 API 客户端库之一轻松完成。
这也使您可以避免在不需要时请求离线访问代码。
这是 Google文档中推荐的方法。
检查那里以获取更详细的说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.