今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Domain-Wide Delegationの利用で「Not Authorized to access this resource/api」エラーが発生する

Perform G Suite Domain-Wide Delegation of Authority  |  Directory API  |  Google Developers

ここに書いてあった手順でやったけど、なかなか動かなくて3日くらいはまった。

このエラーにずっと悩まされた。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 FORBIDDEN
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Not Authorized to access this resource/api",
    "reason" : "forbidden"
  } ],
  "message" : "Not Authorized to access this resource/api"
}


とりあえず、Domain-Wide Delegationの利用する手順を書いとく。

API の有効化

Google Developer Consoleでプロジェクトを選択して、左のメニューから「API Manager」を選択する。

「概要」から使用するAPIを選択して、青い「Enable」ボタンをクリックしてAPIを有効化する。(Enableと表示されてるので有効になってるように見えるけどなってない。)

サービスアカウントの作成

左のメニューの「認証情報」を選択する。

青い「Create Credentials」のボタンをクリックしてドロップダウンリストから「サービスアカウント キー」を選択する。

リストから「新しいサービスアカウント」を選択する。

名前を適当に入れる。キーのタイプは「JSON」が推奨になってるけど、Googleのサンプルが「P12」ファイルを使用するようになっているので、「P12」を選択する。

下の「作成」をクリックするとサービスアカウントができる。

Google Apps にサービスアカウントを登録

Google Apps に対するAPIアクセスを、作成したサービスアカウントに対して許可するために登録する。

Google Apps の管理コンソールにログインする。
Google Apps 管理コンソール

画面の下のグレーのバーにある「その他設定」から「セキュリティ」を選択する。(その他設定にある機能のうち、何度も使うアイコンはホームにドラッグしとくと、いちいちその他設定を経由しなくてよくなる)

「もっと見る」をクリックし「詳細設定」をクリック。
さらに「API クライアント アクセスを管理する」をクリックする。

クライアント名に、作成したサービスアカウントのクライアントIDを入力し、「1 つ以上の API の範囲」には許可するスコープをカンマ区切りで入力する。

右側の「承認」をクリックすると、下にクライアント名とスコープの一覧が表示される。

この操作で、GAEのサービスアカウントとGoogle Appsのひも付けがされたことになる。

コードの実装

ここの一番下にあるコードでそのまま実装すればよい。
Perform G Suite Domain-Wide Delegation of Authority  |  Directory API  |  Google Developers

SERVICE_ACCOUNT_EMAIL は、新しく追加したサービスアカウントのクライアントIDの下に表示されているメールアドレスを使用する。

userEmailは、Google Appsの管理者のメールアドレス。

ハマる

これで書かれていることは全部やったから動くだろうと思ったら、冒頭の「Not Authorized to access this resource/api」というエラー。

何度見なおしても書かれていることは全部やってるのに。

AppIdentityCredential を試す

ここの、Google App Engine identity には、AppIdentityCredential を使えると書いてあるので、使ってみる。

Using OAuth 2.0 with the Google API Client Library for Java  |  API Client Library for Java  |  Google Developers

やっぱり同じエラー。

そもそも、AppIdentityCredential を使うと、Google Apps とのつながりがないから、Google Apps のリソースに対する権限がなさそうなことは想像できる。

それ以来、「GAE "Not Authorized to access this resource/api"」とか、それっぽいキーワードで検索しまくる。ヒットするのは英語のページばかりだから、ひたすら読みまくるけど、なかなか解決できない。

とりあえず、今日は朝から設定とかコードを全部見なおそうと思って、初心に帰ってひととおり眺めてみた。

解決

Google Apps の「API クライアント アクセスを管理する」の画面に最初はタブがあったような気がする。

いまになって見ても見つからないから、たぶん消滅したんだと思う。

右側のタブを選んだら、なんたらかんたらに「同意する」というボタンが二つあるページがあった。

つまり、お膳立ては全部終わってたんだけど、APIアクセスを「承認」してないから「Not Authorized to access this resource/api」って怒られてるんだろうってピンときた。

「コレだ!」って思って同意したら動くようになった。

たぶん、同意したからそのページ(タブ)が消えたんだと思う。