Android + App引擎:user.getUserID()在端点中为null

我有一个带GAE服务器的Android应用程序。 我尝试按照developers.google.com中的描述对用户进行身份validation,我将用户参数添加到端点方法等。我得到一个非空的User,但此方法getUserId()返回null。 它类似于这个相当老的问题: Cloud端点api中的函数User.getUserId()为非空的用户对象返回null但我仍然不知道如何解决它。 你怎么处理这个错误? 你见过它吗?

在Android客户端这里是我做的(简化):

credentials = GoogleAccountCredential.usingAudience(getApplicationContext(), "server:client_id:" + WEB_CLIENT_ID); credentials.setSelectedAccountName(accountName); WarriorEntityEndpoint.Builder endpointBuilder = new WarriorEntityEndpoint.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credentials); warriorEntityEndpoint = endpointBuilder.build(); new AsyncTask() { @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub try { warriorEntityEndpoint.getWarrior().execute(); } catch (Exception e) { } return null; } }.execute(); 

在GAE上:

 @Api(name = "warriorEntityEndpoint", namespace = @ApiNamespace(ownerDomain = "szpyt.com", ownerName = "szpyt.com", packagePath = "mmorpg.monsters"), version = "version1", scopes = {"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"}, clientIds = {Constants.ANDROID_CLIENT_ID, Constants.WEB_CLIENT_ID}, audiences = {Constants.ANDROID_AUDIENCE}) public class WarriorEntityEndpoint { private static final Logger log = Logger.getLogger(WarriorEntityEndpoint.class.getName()); @ApiMethod(name = "getWarrior") public WarriorEntity getWarrior(User user) throws OAuthRequestException, IOException { log.log(Level.SEVERE, "this gives correct email: " + user.getEmail()); log.log(Level.SEVERE, "this is null: " + user.getUserId()); 

我还有另一个非常重要的问题:这个用户是否经过身份validation,如果getMail()给了我正确的帐户,但getUserId()给出了null? 我读过如果用户对象未经过身份validation,则该对象应为null但我不确定…我正在使用App引擎SDK 1.8.7。 我正在测试部署到GAE的真实设备和后端。

我刚才问了同样的问题并得到了答案。 见链接:

Cloud端点api中的函数User.getUserId()为非空的用户对象返回null

原因是appengine的错误。

我想现在没有好的解决方案。 我将电子邮件存储为普通属性并将其从默认提取组中删除,我使用long作为主键(由AppEngine生成),并通过电子邮件属性查询实体。 我不喜欢我的解决方案,如果有人能提供,我会接受(并实施:))更好的解决方案。

这是一个已经提交谷歌的已知问题,我已附上下面的问题链接。

有两种解决方法(1)保存用户并从商店读回,如果它引用了有效帐户,则将填充用户ID(这很糟糕,因为您为每个经过身份validation的API访问支付了保存/加载/删除成本即使它很小,显然有一些性能成本)和(2)你可以使用谷歌+ ID,但这与用户ID不同。

这是非常令人沮丧的,目前还没有ETA,因为他们正在研究auth设计的一些基本问题,据我所知。

请通过主演来投票支持该问题。 您可以在这里find所有信息

https://code.google.com/p/googleappengine/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log&groupby=&sort= &ID = 8848

以下是目前正式批准的解决方法[上面的(1)],您也可以在上面的链接中find它,但为了方便起见 : 我如何根据App Engine中的电子邮件地址确定user_id?

对于上面提到的解决方法(2),您可以查看第一个链接,然后转到#39。