我有一个带GAE服务器的Android应用程序。我尝试按照developers.google.com中的描述对用户进行身份验证,我将用户参数添加到端点方法等。我得到一个非空的User,但此方法getUserId()返回null。它类似于这个相当古老的问题: Function User.getUserId() in Cloud endpoint api returns null for a user object that is not 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?我读过如果没有经过身份验证,用户对象应该为null但我不确定... 我正在使用App引擎SDK 1.8.7。我正在测试部署到GAE的真实设备和后端。
答案 0 :(得分:2)
前一段时间我问了同样的问题并得到了答案。见链接:
Function User.getUserId() in Cloud endpoint api returns null for a user object that is not null
原因是appengine的错误。
答案 1 :(得分:0)
我想现在没有好的解决方案。我将电子邮件存储为普通属性并将其从默认提取组中删除,我使用long作为主键(由AppEngine生成),并通过电子邮件属性查询实体。我不喜欢我的解决方案,如果有人能提供,我会接受(并实施:))更好的解决方案。
答案 2 :(得分:0)
这是一个已经向谷歌提交的已知问题,我已附上下面的问题链接。
有两种解决方法(1)保存用户并从商店回读,如果它引用了有效帐户,则将填充用户ID(这很糟糕,因为您支付每个API访问的保存/加载/删除成本这是经过身份验证的,即使它很小,显然有一些性能成本)和(2)你可以使用谷歌+ ID,但这与用户ID不同。
这非常令人沮丧,目前还没有ETA,因为据我所知,他们正在研究auth设计的一些基本问题。
请通过主演来投票支持该问题。您可以在这里找到所有信息
以下是目前正式批准的解决方法[上面的(1)],您也可以在上面的链接中找到它,但为了方便起见,请点击此处:How can I determine a user_id based on an email address in App Engine?
对于上面提到的解决方法(2),您可以查看第一个链接,然后转到#39。