9

我有一个带有 GAE 服务器的 Android 应用程序。我尝试按照developers.google.com 上的说明对用户进行身份验证,将用户参数添加到端点方法等。我得到一个不为空的用户,但此方法getUserId()返回空。它类似于这个,相当老的问题: Cloud endpoint api 中的 Function User.getUserId() 为非 null 的用户对象返回 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<Void, Void, Void>() {
    @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());

我还有另一个非常重要的问题:如果 getMail() 给了我正确的帐户,但 getUserId() 给了 null,这个用户是否经过身份验证?我读到如果用户对象没有经过身份验证,它应该为空,但我不再确定......我正在使用 App engine SDK 1.8.7。我正在部署到 GAE 的真实设备和后端上进行测试。

4

3 回答 3

2

不久前我问了同样的问题并得到了答案。见链接:

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

原因是 appengine 上的错误。

于 2013-12-18T05:45:55.367 回答
0

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

于 2014-12-13T00:22:21.620 回答
0

这是已向 google 提交的已知问题,我已在下面附上问题链接。

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

这非常令人沮丧,目前还没有 ETA,因为据我所知,他们正在解决一些与身份验证设计有关的基本问题。

请通过为该问题加注星标来投票。你可以在这里找到所有信息

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) 上面],您也可以在上面的链接中找到它,但为了方便起见,这里是:如何根据 App Engine 中的电子邮件地址确定 user_id?

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

于 2015-01-29T02:22:49.800 回答