【问题标题】:Uauthorized when using service account to list Drive files on GSuite使用服务帐号在 G Suite 上列出云端硬盘文件时未经授权
【发布时间】:2020-07-10 16:44:12
【问题描述】:

我有一个使用 Google API 的应用程序。我为它创建了一个服务帐户,下载了密钥并为 GSuite 启用了域范围的委派。范围包括 Drive。 我正在尝试通过使用服务帐户来模拟这样的用户来遍历 GSuite 用户的云端硬盘文件:

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

GoogleCredential.Builder builder = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(serviceAccountEmail)            
    .setServiceAccountPrivateKey(credFromJson(HTTP_TRANSPORT).getServiceAccountPrivateKey())
    .setServiceAccountScopes(SCOPES);
builder.setServiceAccountUser(userEmail);

GoogleCredential credential = builder.build();

return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, null)
                .setApplicationName(APPLICATION_NAME)
                .setHttpRequestInitializer(credential).build();

GoogleCredential 已成功创建。它有 serviceAccountId、serviceAccountPrivateKey、serviceAccountUser 和所需的范围。

但是调用时

driveService.files().list().setFields("nextPageToken, files(*)").execute().getFiles();

我收到 401 未经授权的错误。 我相当确定所有支持服务帐户的步骤都已成功完成,并且启用了域范围的委派,甚至凭证似乎也没有问题。范围肯定是正确的。 接下来我应该看哪里?

【问题讨论】:

    标签: java google-api google-oauth service-accounts


    【解决方案1】:

    401 未经授权的错误。

    表示您没有访问权限。为什么您无权访问是另一个问题。可能是委托设置,也可能是您的身份验证。

    您是否尝试过在服务帐户自己的帐户上执行 file.list 以查看其是否正常工作。这将告诉您是您的授权有问题还是 gsuite 设置有问题。

    但在我看来,您甚至没有设置永远不会起作用的凭据。

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        GoogleCredential credential = GoogleCredential
            .fromStream(new FileInputStream(KEY_FILE_LOCATION))
            .createScoped(DriveScopes.all());
    
        // Construct the Analytics Reporting service object.
        return new Drive.Builder(httpTransport, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME).build();
    

    【讨论】:

    • 它适用于服务帐户自己的帐户。我认为我的代码使用 GoogleCredential.Builder.build() 创建凭据。这是服务帐户的凭据。我把它分成几行:
    • 我编辑了帖子以将凭据放在单独的行中。
    • 如果它与服务帐户自己的帐户一起使用,那么问题在于委派设置。
    • 您可以从谷歌开发者控制台下载三种不同类型的凭据。 web、已安装和服务帐户。使用它们的代码是不同的。上面的代码用于服务帐户凭据,您无法为其提供已安装的凭据。去检查你是否创建了正确的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多