当前位置: 首页 > 面试题库 >

用于Java的OAuth Google API无法模拟用户

萧晔
2023-03-14
问题内容

我想模拟一个用户,并代表他们从服务器进程向用户Google
Drive添加文件。我已经设置了服务帐户,并且可以使用以下代码作为添加和列出文件的服务帐户成功访问云端硬盘:

  /** Global instance of the HTTP transport. */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /** Global instance of the JSON factory. */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  public static void main(String[] args) {
    try {
        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .build();
        Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();         
        drive.files().list().execute();
  } catch (Exception e) {
     e.printStackTrace();
  }

这可行,但是仅返回与我认为与服务帐户驱动器(?)相关联的文件。

根据JavaDoc,通过添加服务帐户用户的电子邮件地址,还可以使用GoogleCredential来模拟用户:

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .setServiceAccountUser("usera@domain.com") //<-- impersonate user a
                  .build();

但是,执行此代码时,将引发以下异常:

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "access_denied"
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:508)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:260)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:796)
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:198)
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237)
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
at com.google.api.services.drive.Drive$Files$List.execute(Drive.java:1071)

我是否缺少步骤或配置设置?

谢谢大卫


问题答案:

cPanel文档有点误导,因为它涉及启用使用者密钥,然后将域添加到Manage API Client Access屏幕。这似乎对gdata
api有效,而不对新的Google Drive api有效。通过按照其他问题中的建议添加客户端ID并授予对Drive范围的访问权限,我现在可以模拟用户。



 类似资料:
  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。

  • 我正在按照说明测试从另一个java程序调用我的模拟模型。 java程序将使用RepastMain配置启动GUI: 如果我应用非GUI配置,java程序将很快在不运行和不返回任何内容的情况下终止: 如何在无头模式下启用模拟运行? 其次,我需要在远程服务器(Linux)上部署我的仿真模型。服务器调用我的仿真模型的最佳方式是什么?如果是HTTP,接下来如何执行配置?模型的运行最好是批处理运行方法(根据用

  • 问题内容: 我们要模拟的其中一个Java类中有一个URL对象,但这是最后一个类,因此不能。我们不想上一个级别,并模拟InputStream,因为这仍然会使我们留下未经测试的代码(我们有严格的测试覆盖率标准)。 我已经尝试过jMockIt的反射功能,但是我们在Mac上工作,并且Java代理处理程序存在我无法解决的问题。 那么,有没有不涉及在junit测试中使用真实URL的解决方案? 问题答案: 当我

  • 我正在测试一个Springmvc控制器,它得到一个网络服务客户端自动配带,它被嘲笑了。但是嘲笑并没有奏效。在测试返回中调用“验证(stuClient,乘以(1))”。获取所有学生(sAndP命令); 下面是我测试中的控制器方法: 下面是我的测试类:

  • 给定类别FOO: 我尝试使用JDK8而不是9,它工作得很好。我不知道它为什么会失败,也不知道我怎么才能让它成功。 当是依赖项时,就会发生此问题。如果您为其他类型(如)更改它,它可以正常工作...

  • 问题内容: 我已经写了一家工厂来生产物体: 我想验证传递给的参数,但不知道如何模拟静态方法。我在测试用例中使用的是和。有没有模拟或验证此特定用例的好方法? 问题答案: 在Mockito上使用PowerMockito。 示例代码: