ども、@kimihom です。
たぶん GCP ネタは初めてかな? 今回はがっつり Google APIs について調べたので、それについて書く。
Google APIs OAuth の目的
今回は、ユーザーの GCP アカウントを使って、GCP の API を呼ぶケースについて想定する。 例えば、GCP の機械学習系の API を使いたいって思った時、自分たちが使うってだけなら 自分の GCP アカウントを使えばいいだけだけど、それを機能としてユーザーに提供するってなった時、GCP でかかる費用を全額負担しないといけなくなってしまう。 そうせずに、ユーザーの GCP アカウントを使って API を実行することで、使った分だけユーザーの GCP アカウントで決済が行われるようになる。
そのためには Google APIs の OAuth を使って、そこで得られたアクセストークンを使って 各 Google APIs を実行すれば良いことになる。
OAuth 認証の準備
まず、OAuth を実現したいサービスは、マスターとなる GCP アカウントで登録された Google Search Console への登録が必須だ。なので、そこで登録された以外の GCP のアカウントではそもそも OAuth の実現は不可能なので注意しよう。
Google APIs における OAuth の管理画面は以下の URL からアクセスできる。
https://console.developers.google.com/apis/credentials/domainverification
まずは「ドメインの確認」タブで、Search Console で登録済みのアプリケーションを指定しよう。
次に認証情報を作成 -> OAuth クライアントID を選択する。ウェブアプリケーションの場合は、認証が通った後のリダイレクト URI を指定してあげる必要がある。ユーザーが Google ログイン画面を開いて「許可」押した後に渡ってくるトークンを受け取るための URI となる。ここら辺はどの OAuth でも同じだ。
API キーを作る方法もあるにはあるんだけど、この場合、トークンを取得するためにユーザーがわざわざこの GCP のページに行って、トークンを作成し、サービス側にそのトークンをコピペしてもらうっていう手間が発生してしまう。OAuth で作れば認証画面が出て許可を押すだけでよくなるので、ユーザー体験的には圧倒的に OAuth を利用することをお勧めする。
続いて 「OAuth 同意画面」タブにて、表示する項目を諸々セットしよう。ここで、基本的にお金のかかる GCP の API を利用する場合には Google の審査が必要であることに注意しよう。「スコープの追加」をすることで、課金の発生するような GCP の API を呼び出せるようになる。このスコープの定義はそれぞれ使いたい API に応じてセットしてあげる必要がある。以下に一覧が表示されているので適切に選ぼう。
その他、諸々セットが完了したらとりあえず保存しておいて次に進む。
認証ページ
一度 作成が完了すると、クライアント ID と クライアントシークレットが生成される。その情報をもとに、OAuth 認証画面を表示させよう。以下に例を表示する。
GET https://accounts.google.com/o/oauth2/v2/auth? response_type=code& client_id=my_client_id& redirect_uri=https://my-awesomeapp.com/auth/& scope=https://www.googleapis.com/auth/cloud-platform& access_type=offline
この URI を叩くと、Google の認証画面に飛ぶ。ただし特殊スコープが定義されている API 連携で、 Google の OAuth 連携審査が通っていない場合には警告が表示される。
ここで「許可」を押すと、GCP 側でセットしたリダイレクト URI に code パラメータが含まれた状態でリクエストが飛んでくる。この code を使って、今度は アクセストークンを生成することになる。
なお、アクセスを許可したアプリケーションを一度削除したいって場合には Google アカウントのパーミッションのページで適宜削除することが可能だ。OAuth のテストで訪れることがあると思うのでリンクを紹介しておく。
https://myaccount.google.com/u/2/permissions
アクセストークンの取得
GCP の API を呼べるようにするためには、作成された code をアクセストークンに変換してあげる必要がある。
GET https://www.googleapis.com/oauth2/v4/token code=$AUTHORIZATION_CODE client_id=$CLIENT_ID client_secret=$CLIENT_SECRET redirect_uri=$REDIRECT_URI grant_type=authorization_code access_type=offline
既に上記で必要な情報は今までの手順の中で取得できているはずだ。適切に呼び出しが完了すると、無事アクセストークンとリフレッシュトークンが返ってくる。アクセストークンの期限は1時間だ。てことで基本的には GCP API を呼ぶには、まずリフレッシュトークンからアクセストークンを取得して、その最新のアクセストークンを使って呼びたい GCP API を呼ぶっていう実装になる。
リフレッシュトークンから最新のアクセストークンを取得しよう。
GET https://www.googleapis.com/oauth2/v4/token refresh_token=$REFRESH_TOKEN client_id=$CLIENT_ID client_secret=$CLIENT_SECRET grant_type=refresh_token
GCP API の実行
さて、これでいよいよ呼びたい GCP API を呼べるようになる。呼びたい API に アクセストークン込み(Authorization: Bearer ヘッダ)の HTTP リクエストを送れば OK だ。
これで、OAuth を許可したユーザーの GCP アカウントを経由して API を呼び出せるようになった。めでたしめでたし。
TODO
あとはテストをして準備完了!ってなったら GCP の "OAuth 同意画面" へ行って、「確認のための送信」をして Google に審査をしてもらおう。これが通れば先ほどの警告ウィンドウが表示されずに OAuth 認証ができるようになるはずだ。
追記: 申請を出してみたら、サービスアカウントをゴニョゴニョ..てことで審査が通らなかった。ドキュメント読んでも具体的にどうすればいいのか謎だったので一旦諦めた。
終わりに
今回は GCP の OAuth 認証の実装についてご紹介した。
さすが Google ってだけあって、標準に乗っ取った簡潔な実装方法になっている。これ AWS で調べたら「・・・」って感じだったのだが、機会があれば改めて AWS の OAuth の方も調べてみようと思う。
GCP の API を駆使して革新的なアプリケーションを作っていこう。