0

我正在关注这个示例,以便允许用户在远程服务器上使用他的 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"
}

那么,issued_to 或 Audience 字段可能对于该验证很重要?

编辑:我不是指中间攻击的人。例如,假设我创建了一个允许 gmail 登录的名为 VirusX 的游戏。如果没有进行额外的验证,我可以保存 access_tokens 并使用它们通过 gmail 登录访问其他应用程序。

使用 facebook API 可以这样解决:

4

3 回答 3

1

tokeninfo端点很可能正在为您验证令牌。只要您使用 HTTPS 与之通信,您就可能是安全的。你也可以自己解压和解析令牌,有这方面的库,但实际上很容易。请参阅此处的一些详细信息。你真的应该看看上面建议的验证后端调用链接,它更强大,让你不仅可以验证用户,而且可以验证请求来自你自己的应用程序(尽管有一些方法可以在有根设备上欺骗它)。

对于已编辑的问题:

令牌已签名,因此您可以对其进行验证。如果验证失败,则令牌已被篡改,您不应信任它(Googletokeninfo端点会这样做)。它还有一个有效期,所以你可以检查它是否过期。因此,如果有人访问令牌并将其发送到您的服务(重播),他们只能在有限的时间内使用它(通常为 30-60 分钟)。如果您使用后端验证技术,它还可以通过验证您的包名称和签名证书哈希来确保令牌来自您的应用程序而不是病毒 X,您必须提前注册。请阅读它的工作原理并使用它来代替“原始”配置文件令牌。

一般来说,不记名类型的令牌就像一个 cookie——如果你有它,就无法区分原始所有者和窃取它的人。缓解因素是令牌可以被撤销并且它的有效期有限。

于 2013-05-08T08:29:59.990 回答
1

有人可以欺骗的唯一方法是通过中间人攻击和 DNS 攻击。除非您预计会出现极端违规行为,否则请不要打扰。如果您遵循简单的安全措施,就很难击败 OAuth 提供商(身份管理他们的工作!)。正如 britzl 所说,按照教程进行操作,您的代码就完成了。

于 2013-05-07T20:40:15.930 回答
1

我知道这并不能真正回答您的问题,但我想提供有关如何使用 Google 帐户登录的替代教程/示例。我建议您查看这篇关于如何使用 Google Play 服务和 oAuth2 验证后端调用的帖子。我们在几周前实施了这一点,这非常容易。使用这种技术,任何人都无法欺骗访问令牌。

于 2013-05-03T10:25:59.767 回答