2013-12-15 96 views
3

我使用GoogleAuthUtil.getToken()在Android应用中获取一次性代码,然后将其发送到我们的服务器。我们的服务器然后交换这个访问令牌,并使用它来获取用户的电子邮件。Google API来自GoogleAuthUtil.getToken的一次性授权码无效授予

这似乎工作。但是,如果我做到以下几点:

  1. 获取一次性代码
  2. 它发送到服务器
  3. 消费它,并验证用户
  4. 擦拭Android应用数据(使它忘记认证
  5. 获取一次性代码

第二一次性代码实际上是等同于第一。

这已经已经被使用一次,所以想换取一个访问令牌的第二遍的时候服务器得到以下错误:

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()返回一次性代码?

这在部署情况下可能不是问题,因为大多数用户只会登录一次,所以这是否是设计?我应该以任何方式在服务器上处理它,或者只是接受这会发生?

+0

查看注释#2来回答这里:http://stackoverflow.com/questions/18959880/is-googleauthutil-gettoken-thread-safe不知道他的来源是什么,但。 – soulseekah

+0

谢谢。似乎是这样,它被缓存。也许有点奇怪,因为服务器无论如何都不能再次接受这个令牌。 – jnystad

+0

对于客户端在10分钟内安装两次的罕见情况,您的服务器应向客户端返回一个很好的错误:“稍等一会,再试一次,速度太快......”。 – soulseekah

回答

2

似乎使用GoogleAuthUtil.invalidateToken(上下文,令牌)可以使令牌失效。然后您可以通过下次调用getToken()来请求新的令牌。但是这需要添加用户权限android.permission.MANAGE_ACCOUNTS。