我正在关注THIS示例,以便允许用户在远程服务器中使用他的Google帐户登录。
基本上我在客户端获取access_token并将其发送到我的服务器。在服务器中,我检查
的响应https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=XXXX
获取用户的电子邮件并在服务器中对其进行身份验证。
但是我有一个安全问题,如果恶意开发者创建了一个允许Gmail登录的应用程序,存储用户的访问令牌并使用它们在我的服务器中欺骗他们的身份怎么办?我怎么能避免这种情况?有没有办法验证获得访问令牌的应用程序的签名?
返回的令牌信息如下:
{
"issued_to": "XXXXXXXXXXXXXX.apps.googleusercontent.com",
"audience": "XXXXXXXXXX.apps.googleusercontent.com",
"user_id": "15285874285447",
"scope": "https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email",
"expires_in": 3562,
"email": "user@mail.com",
"verified_email": true,
"access_type": "online"
}
因此,发布的字段或受众可能对该验证很重要吗?
编辑:我不是说中间人攻击的人。例如,假设我创建了一个名为VirusX的游戏,允许gmail登录。如果没有进行额外的验证,我可以保存access_tokens并使用它们使用gmail登录访问其他应用程序。使用facebook API以这种方式解决:
Invalid OAuth access token signature
答案 0 :(得分:1)
我知道这并不能真正回答您的问题,但我想提供一个关于如何使用Google帐户登录的备用教程/示例。我建议您使用Google Play服务和oAuth2查看此帖regarding how to verify backend calls。几个星期前我们实现了它,这很简单。使用这种技术,任何人都无法欺骗访问令牌。
答案 1 :(得分:1)
有人可以欺骗的唯一方法是通过中间人和DNS攻击。除非你期待极端的违规行为,否则不要打扰。如果您遵循简单的安全措施,那么击败OAuth提供商(身份管理他们的工作!)就太难了。正如britzl所说,请按照教程完成代码。
答案 2 :(得分:1)
tokeninfo
端点最有可能为您验证令牌。只要您使用HTTPS与之通信,您就可以安全了。你也可以自己解压缩和解析令牌,有这个库,但实际上很容易。在此处查看一些details。您应该看看上面建议的验证后端调用链接,它更强大并且不仅可以验证用户,还可以验证请求来自您自己的应用程序(虽然有办法在root用户设备上欺骗它)。
编辑问题:
令牌已签名,因此您可以对其进行验证。如果验证失败,则令牌已被篡改,您不应该信任它(Google tokeninfo
端点会这样做)。它还有一个有效时间,因此您可以检查它是否已过期。因此,如果有人访问令牌并将其发送到您的服务(重播),他们只能在有限的时间内使用它(通常为30-60分钟)。如果您使用后端验证技术,它还会通过验证您的包名称和签名证书哈希来确保令牌来自您的应用而不是病毒X,您必须提前注册。请阅读它的工作原理并使用它代替“原始”配置文件令牌。
通常情况下,承载类型令牌就像一个cookie - 如果你拥有它,就无法区分原始所有者和偷走它的人。缓解因素是令牌可以被撤销并且其有效时间有限。