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 を使えると書いてあるので、使ってみる。
やっぱり同じエラー。
そもそも、AppIdentityCredential を使うと、Google Apps とのつながりがないから、Google Apps のリソースに対する権限がなさそうなことは想像できる。
それ以来、「GAE "Not Authorized to access this resource/api"」とか、それっぽいキーワードで検索しまくる。ヒットするのは英語のページばかりだから、ひたすら読みまくるけど、なかなか解決できない。
とりあえず、今日は朝から設定とかコードを全部見なおそうと思って、初心に帰ってひととおり眺めてみた。
解決
Google Apps の「API クライアント アクセスを管理する」の画面に最初はタブがあったような気がする。
いまになって見ても見つからないから、たぶん消滅したんだと思う。
右側のタブを選んだら、なんたらかんたらに「同意する」というボタンが二つあるページがあった。
つまり、お膳立ては全部終わってたんだけど、APIアクセスを「承認」してないから「Not Authorized to access this resource/api」って怒られてるんだろうってピンときた。
「コレだ!」って思って同意したら動くようになった。
たぶん、同意したからそのページ(タブ)が消えたんだと思う。