云端点返回错误401未经授权的请求

时间:2014-09-03 15:56:46

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

所以我已经在应用程序中使用了一些云端点,并且正在通过在Android客户端中保护它们的过程。每次我尝试使用Android客户端代码中的数据时,都会收到错误401" Unautorized Access"。我可以告诉为什么异常被抛出,因为我正在检查用户'每个api方法的参数。但我的问题是为什么我总是为我的api方法获得一个空用户。我已成功为端点构建器提供了正确的凭据,并使用手机上的帐户设置了setSelectedAccountName。这是我的例子:

一种api方法:

 public CollectionResponse<Student> getAllStudents(User user) throws OAuthRequestException {
        if (user == null)
               throw new OAuthRequestException("BAD_USER");
        else {
               List<Student> stud = ofy().load().type(Student.class).list();
               return CollectionResponse.<Student>builder().setItems(stud).build();
           }
    }

这也位于api的顶部:

@Api(name = "studentEndpoint", version = "v1", namespace = @ApiNamespace(ownerDomain = "appbackend.mymodule.example.com", ownerName = "appbackend.mymodule.example.com", packagePath=""),
            scopes = {Constants.EMAIL},
            clientIds = {Constants.WEB_CLIENT_ID, Constants.ANDROID_CLIENT_ID},
            audiences = {Constants.ANDROID_AUDIENCE})

我在Android客户端使用客户经理抓取帐户电子邮件,设置凭据并获取访问令牌。

GoogleAccountCredential cred = GoogleAccountCredential.usingAudience(AddUser.this, AppConstants.AUDIENCE);
                cred.setSelectedAccountName(emailAccount);

这就是我在客户端代码中使用它的方式:

StudentEndpoint service = AppConstants.getApiHandle(cred);
                stud = service.getAllStudents().execute();

上述代码是异步调用的。

我已经对我的客户ID进行了三次检查,以确保它们是正确的。我也是通过adb将这个从android studio直接安装到我的手机上。我在谷歌云控制台中有我的调试SHA1,但我也需要我的版本SHA1。我没想到我会因为我还没有为这个应用程序创建发行密钥而且只使用了未签名的副本。如果我使用网络客户端我可以进行身份​​验证,但每次我发出请求时都会收到错误401,并且我看到了我的异常&#39; BAD_USER&#39;抛出。我确实有一个“持票人”#39;钥匙表明我有权访问。

如果我取消模块中User参数的nullcheck,方法工作正常,我可以从我的数据存储区获取数据。所以我每次做api请求时都会得到一个空用户的原因是什么?任何帮助深表感谢。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我建议重新审视以下3点:

  • 确保您的包名称正确,即Android应用程序和在云端控制台中创建凭据时指定的包名称相同。

  • 您可以检查代码中AppConstants.AUDIENCE的值吗?理想情况下,它需要采用以下格式&#34; server:client_id:WEB_CLIENT_ID&#39;

  • 确保您的Constants.WEB_CLIENT_IDConstants.ANDROID_AUDIENCE

  • 相同