Android 为什么谷歌登录安卓系统时会返回“a”;“分;与托管域帐户的UserService.getCurrentUser()不同的用户标识符?

Android 为什么谷歌登录安卓系统时会返回“a”;“分;与托管域帐户的UserService.getCurrentUser()不同的用户标识符?,android,google-app-engine,google-authentication,Android,Google App Engine,Google Authentication,对于不是托管域帐户的Google帐户,返回的sub用户标识符始终与UserService.getCurrentUser().getUserId()的响应匹配 但是,对于托管域帐户,子标识符与来自UserService.getCurrentUser().getUserId()的响应不匹配。我们如何为托管域帐户提供公共用户标识符,无论用户是使用Google登录Android Id令牌还是通过服务器端用户服务浏览器登录?至于原因:我很确定这种差异是Google App Engine直接使用Google

对于不是托管域帐户的Google帐户,返回的
sub
用户标识符始终与
UserService.getCurrentUser().getUserId()
的响应匹配


但是,对于托管域帐户,
标识符与来自
UserService.getCurrentUser().getUserId()
的响应不匹配。我们如何为托管域帐户提供公共用户标识符,无论用户是使用Google登录Android Id令牌还是通过服务器端用户服务浏览器登录?

至于原因:我很确定这种差异是Google App Engine直接使用Google自己的身份验证/用户帐户系统造成的,而Identity Kit是一个与多个OAuth提供者集成的独立项目。换句话说,它们是独立的项目,在某些时候只是松散地集成在一起

为了解决这个问题,我的建议是不要在appengine上使用Google的原生身份验证API,而只是使用,这当然会使用与Android/iOS身份对象相同的数据和模式。仅仅像使用任何其他web应用程序一样使用Identity Toolkit是非常简单的,并且它在GAE之外是可移植的


若在创建应用引擎时,Identity Toolkit就已经存在,那个么它们可能会自动集成,一切都会正常工作。但我发现你不能真正地把它们混搭在一起;您可以选择一个并坚持使用。

我无法评论它们的不同之处,但是一个退步是将电子邮件地址用作托管域帐户的通用Id作为idToken。getPayload().getEmail()应始终与UserService.getCurrentUser().getEmail()匹配。但是,Google帐户的电子邮件地址可以更改,因此,这不是一种非常可靠的唯一识别用户的方法。