我正在关注这个示例,以便允许用户在远程服务器上使用他的 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 可以这样解决:
- 您使用您的 FACEBOOK_APP_ID 请求令牌(Facebook SDK 验证应用签名)
- 用户登录,您获得 access_token 并将其发送到服务器
- 服务器检索 USER_ID 调用https://graph.facebook.com/me?access_token=XXXXX
- 然后服务器调用https://graph.facebook.com/USER_ID?access_token=FACEBOOK_APP_ID|FACEBOOK_SECRET
- 此时,如果未使用您的 FACEBOOK_APP_ID 检索到令牌(密码将不匹配),您将收到
Invalid OAuth access token signature