【发布时间】:2014-01-02 21:26:40
【问题描述】:
我正在使用 GoogleAuthUtil.getToken() 在 Android 应用程序中获取一次性代码,然后将其发送到我们的服务器。然后,我们的服务器将其交换为访问令牌,并使用它来获取用户的电子邮件。
这似乎有效。但是,如果我执行以下操作:
- 获取一次性验证码
- 发送到服务器
- 使用它并验证用户身份
- 擦除 Android 应用数据(使其忘记身份验证
- 获取一次性验证码
第二个一次性代码实际上与第一个相同。
这已经被消费了一次,因此服务器在第二次尝试将其交换为访问令牌时收到以下错误:
Error:"invalid_grant", Description:"Invalid code.[Email:
Token Record:
Token: "4/aQQ_nbklfajrilawjvlkasjvVMD.AMsaNNC-gdsai3gJDIAvajvkrelwiDDI"
IssueDomain: "123456789012-1231231564adsafdas1f23a45fd6sad2.apps.googleusercontent.com"
IssueTimeSec: 1387110988
ExpirationTime: 1387111588
TokenUsage: 3
Scope: "https://www.googleapis.com/auth/plus.login"
Scope: "https://www.googleapis.com/auth/userinfo.email"
Scope: "https://www.googleapis.com/auth/plus.moments.write"
Scope: "https://www.googleapis.com/auth/plus.me"
Scope: "https://www.googleapis.com/auth/plus.profile.agerange.read"
Scope: "https://www.googleapis.com/auth/plus.profile.language.read"
Scope: "https://www.googleapis.com/auth/plus.circles.members.read"
ServiceInfo {
ServiceId: 123
Info <
[13245678] <
0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a
>
>
}
ServiceInfo {
ServiceId: 226
Info <
[security_lso_auth_oauth2.EarlyIssuedTokenProto] <
auto_approved: false
access_token: "fd12.a.Afdsa1eawfdsa2avi_f1ds2af15eaw61f2ag45a6v8-1f3ds2af5ew6a12-ad5A"
refresh_token: "2/da4ge5a4f5dsav-fsa54fe4wa5f_dfasenU-dsaddew"
>
>
}
Revoked: true
AuthorizedBy: 0x1234567890
OAuthCallbackUrl: "urn:accounts.google.com:api_auth:programmatic:virtual_redirect_uri"
OfflineAccess: true
RevokeOnPasswordChange: true
ClientManagedRevocation: false
InBundle: true
]", Uri:""
(敏感数据替换为随机值)
我看到尚未达到 ExpirationTime(10 分钟有效期),但一次性代码不应该只从 GoogleAuthUtil.getToken() 返回一次吗?
这在部署情况下可能不是问题,因为大多数用户只会登录一次,这是设计使然吗?我应该在服务器上以任何方式处理它,还是只是接受这会发生?
【问题讨论】:
-
查看评论 #2 以在此处回答:stackoverflow.com/questions/18959880/… 不过不确定他的来源是什么。
-
谢谢。似乎是这样,它被缓存了。可能有点奇怪,因为无论如何服务器都不能第二次接受这个令牌。
-
您的服务器应该向客户端返回一个很好的错误,上面写着:“稍等一下,再试一次,你的速度太快了......”对于客户端安装两次的罕见情况10 分钟。
标签: android google-api oauth-2.0