そのため、この問題の背景を少し説明します。ユーザー カレンダーとリソース カレンダーの両方を管理するために、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()
どんな助けでも大歓迎です