1

そのため、この問題の背景を少し説明します。ユーザー カレンダーとリソース カレンダーの両方を管理するために、Google カレンダー API と Google 管理 SDK の両方を使用するローカル アプリケーションがあります。

セットアップで行った手順は次のとおりです

  • サービス アカウントを作成し、ドメイン全体のアクセス権を付与
  • 開発者コンソールに Google Calendar API と Admin SDK の両方を追加して有効にしました
  • Gsuit 管理コンソールの [API クライアント アクセスの管理] セクションにクライアント ID とスコープを追加しました

ここで資格情報を作成します (テスト目的で、json ファイルにローカルに保存しています)

val JSON_FACTORY: JsonFactory = JacksonFactory.getDefaultInstance()
var HTTP_TRANSPORT: HttpTransport = GoogleNetHttpTransport.newTrustedTransport()
var SCOPES = DirectoryScopes.all()

val cred = new GoogleCredential.Builder()
  .setTransport(HTTP_TRANSPORT)
  .setJsonFactory(JSON_FACTORY)
  .setServiceAccountId(CLIENTID)
  .setServiceAccountScopes(SCOPES)
  .setServiceAccountUser(USER)
  .setServiceAccountPrivateKey(serviceAccountCredJson.getServiceAccountPrivateKey)
  .setServiceAccountPrivateKeyId(serviceAccountCredJson.getServiceAccountPrivateKeyId)
  .build()

cred.refreshToken()

そして、私が遭遇する最初の問題は、行を削除した場合です

.setServiceAccountUser(USER)

次に、cred.refreshToken() == true ですが、 my_customerのリソースのリストを取得しようとすると、このエラーが発生します

404 Not Found
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "message" : "Domain not found.",
    "reason" : "notFound"
  } ],
  "message" : "Domain not found."
}
com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found

ユーザーになりすますと、 cred.refreshToken()が原因でこのエラーが発生します

401 Unauthorized
com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.iofficeconnect.reservation.google.GoogleDirectoryClient$.getCredsAsUser(GoogleDirectoryClient.scala:96)

Admin SDK を操作するには、管理者の資格情報を持つユーザーになりすます必要があることを理解していますが、これを行っても同じ結果が得られます。


Admin SDK に接続するクライアントは、これらの行に組み込まれています。

def getClientAsUser(user:String):Directory={
    new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, testCredJsonAsTestUser(user))
      .setApplicationName(APPLICATION_NAME)
      .build()
}

Admin SDK への最後の呼び出しは、これらの行で実行されます。

var client = getClientAsUser(admin@domain.com)
var calendarList = client.resources().calendars().list("my_customer").execute()

どんな助けでも大歓迎です

4

1 に答える 1