Google App Engine云端点userId为空

时间:2014-11-07 13:41:51

标签: java android google-app-engine google-cloud-endpoints

我正在使用此course的一个(稍加修改的)解决方法来获取userId,如果请求是从Android客户端发送的,则为null。

/**
 * This is an ugly workaround for null userId for Android clients.
 *
 * @param user A User object injected by the cloud endpoints.
 * @return the App Engine userId for the user.
 */
private static String getUserId(User user) {
    String userId = user.getUserId();
    if (userId == null) {
        LOG.info("userId is null, so trying to obtain it from the datastore.");
        AppEngineUser appEngineUser = new AppEngineUser(user);
        ofy().save().entity(appEngineUser).now();

        AppEngineUser savedUser = ofy().load().key(appEngineUser.getKey()).now();
        userId = savedUser.getUser().getUserId();
        LOG.info("Obtained the userId: " + userId);
    }
    return userId;
}

虽然我无法获得userId。

INFO: Obtained the userId: null

此解决方法已在其他项目中完美运行,因此问题必须在其他地方。我的端点api使用以下范围注释:clientIds和audience:

scopes = {
            Constants.EMAIL_SCOPE
    },
    clientIds = {
            Constants.API_EXPLORER_CLIENT_ID,
            Constants.WEB_CLIENT_ID,
            Constants.ANDROID_CLIENT_ID
    },
    audiences = {
            Constants.ANDROID_AUDIENCE
    }

Constants.ANDROID_AUDIENCEConstants.WEB_CLIENT_ID是相同的。我没有使用Web客户端,但Google told me添加了Web客户端ID。此客户端ID是否需要重定向uris和javascript来源?

在我的Android客户端中,我使用以下内容指定受众群体。

mCredential = GoogleAccountCredential.usingAudience(
        EndpointService.this,
        "server:client_id:IDIDIDID.apps.googleusercontent.com"
);

请帮我弄清楚这个。

1 个答案:

答案 0 :(得分:0)

我只是理解为什么这个解决方法有效。我需要开始一个新的客观化会话,因此不使用缓存并且可以填充userId。

Objectify objectify = ofy().factory().begin();
AppEngineUser savedUser = objectify.load();