【问题标题】:Unable to access Users Watch API (Status 403 returned) although Users List API works normally尽管用户列表 API 正常工作,但无法访问用户监视 API(返回状态 403)
【发布时间】:2020-10-21 08:39:41
【问题描述】:

我使用具有范围 (https://www.googleapis.com/auth/admin.directory.user.readonly) 的服务帐户密钥来访问 Google Directory API 用户。

通过与以下相同的设置,我可以访问用户列表 API (link)。

但在尝试向用户观察 API (link) 发出请求时,返回状态 403。

这 2 个 API 需要与我的 SA 密钥具有相同范围的 user.readonly。

我的域已经过验证并添加到 GCP Console 的域验证屏幕中。

val httpTransport = GoogleNetHttpTransport.newTrustedTransport()
val jsonFactory = JacksonFactory()
val inputStream = HealthController::class.java.getResourceAsStream("/credentials.json")
        ?: throw FileNotFoundException("/credentials.json")
val credential = GoogleCredential.fromStream(inputStream, httpTransport, jsonFactory)
        .toBuilder()
        .setServiceAccountScopes(listOf(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY))
        .setServiceAccountUser("admin@example.com")
        .build()
service = Directory.Builder(httpTransport, jsonFactory, credential)
        .setApplicationName("Some Name")
        .build()

val channel = Channel()
channel.address = "https://example.com/webhook/v1/google/users"
channel.expiration = Instant.now().toEpochMilli() + 6 * 60 * 60 * 1000
channel.id = "webhook001"
channel.token = "abcxyz"
channel.type = "web_hook"
channel.payload = false

val result = service.users().watch(channel)
        .setDomain("example.com")
        .setViewType("domain_public")
        .execute()

我将问题记录到 Google 问题跟踪器:https://issuetracker.google.com/issues/171300784

【问题讨论】:

  • 您是否尝试过在令牌中使用https://www.googleapis.com/auth/admin.directory.user 范围?
  • @JoseVasquez 不,我没有,我应该试试吗?
  • 您的 Kotlin 编译执行哪个 JVM 版本?这可能会影响您的代码,因为 Google 不直接支持 Kotlin 的 Directory API,请查看您的版本并确认这是以下here 之一。
  • 我使用 kotlin-maven-plugin 和 jvmTarget 为 1.8
  • 但我本地机器上的 JVM 版本是 11

标签: kotlin google-admin-sdk google-directory-api


【解决方案1】:

Google Directory API 不直接支持 Kotlin,它依赖于目标编译

先决条件

确保您已激活Delegating domain-wide authority to the service account

解决方法

作为 JAVA 中的一种方法(如果需要,您可以将此代码转换为 Kotlin)首先使用官方文档的 watch method 以及 Channel class,我会将包依赖项放在注释中:

JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

// com.google.auth.oauth2.ServiceAccountCredentials
GoogleCredentials credentials = ServiceAccountCredentials.fromStream(new FileInputStream(SERVICE_ACCOUNT_CREDENTIALS_FILE_PATH))
            .createScoped(SCOPES)
            .createDelegated("impersonated@example.com");

// com.google.api.client.http
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);

// com.google.api.services.admin.directory.Directory.Builder
Directory service = new Directory.Builder(httpTransport, jsonFactory, requestInitializer)
                .setApplicationName(APPLICATION_NAME)
                .build();

// com.google.api.services.admin.directory.model.Channel
Channel channel = new Channel();
channel.setAddress("https://example.com/webhook/v1/google/users");
channel.setExpiration(Instant.now().toEpochMilli() + 6 * 60 * 60 * 1000);
channel.setId("webhook001");
channel.setToken("abcxyz");
channel.setType("web_hook");
channel.setPayload(false);

System.out.println(service.users().watch(channel)
                .setDomain("example.com")
                .setViewType("domain_public")
                .execute());

参考

Javadoc Directory API

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2020-04-14
    • 2021-12-04
    相关资源
    最近更新 更多