OAuth2.0のGCPでのシーケンスや推奨方法を調べてみました。OAuth2.0の簡単な概要からGCPで採用している認証方法とOAuth2.0で許可証を発行する場合のシーケンスとサンプルとなります。
OAuth2.0とは?
OAuth2.0はクライアントに許可証を発行する仕組みです。許可証を持っていればリソースサーバからデータの取得が可能で、持っていなければはじかれます。OAuth2.0はOAuth1.0の課題(デスクトップやモバイルアプリ対応など)を改善したものとなっています。
このあたりの記事がわかりやすくまとまっていました。
qiita.com
GCPで採用している認証処理
Googleだとリソースサーバにアクセスするにはいか3つの方法があります。APIキー以外はOAuth2.0が採用されてます。
公式サイトにやると推奨はサービスアカウントキーを「使ったもののようです。
- API キーは最も簡単な認証スキームで、ID のみを提供します。共有シークレットによって安全な認証が検証されることはなく、キー制限によって暗黙的な認>証形式が提供されます。
- サービス アカウントでは公開鍵 / 秘密鍵交換によって ID と認証の両方を提供します。この交換により、API 自体を含めてリソースへのアクセスに使用する認証トークンが生成されます。サービス アカウントの使用は、バックエンドが Cloud API に対して安全に認証するための推奨される方法です。
GCPのOAuth2.0のシーケンス
ユーザー アカウントとサービス アカウントのOAuth2.0のシーケンスは以下となります。
ユーザー アカウント
Cloud SDKを使う方法です。検証ならこちらで十分だと思います。
サンプルで試す
Cloud SDKとサービスアカウントキーを使ったサンプルを書きます。
ユーザアカウントの場合
ユーザアカウントの場合Cloud SDKを使います。自分の場合は以下のコマンドをよく実行します。以下はリソースサーバにアクセスするクライアントの違いです。
$ gcloud auth login $ gcloud auth application-default login
例えばGCSにへgsutilコマンドでデータを送りたい場合 gcloud auth loginです。
$ gsutil cp *.csv gs://??????/
クライアントアプリを使い場合はgcloud auth application-default loginとなります。
from google.cloud import bigquery import pandas as pd import warnings warnings.filterwarnings('ignore') sql = """ SELECT pickup_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, passenger_count, trip_distance, tolls_amount, fare_amount, total_amount FROM `nyc-tlc.yellow.trips` LIMIT 10 """ client = bigquery.Client() trips = client.query(sql).to_dataframe() trips.head()
サービスアカウントキーの場合
インスタンス生成時にサービスアカウントキーのパスを渡します。
サービスアカウントキーの発行はCloud Platform Console で、[API Manager] → [認証情報] パネルに移動して行なってください。
console.cloud.google.com
from google.cloud import bigquery import pandas as pd import warnings warnings.filterwarnings('ignore') key_path = "path/to/service_account.json" sql = """ SELECT pickup_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, passenger_count, trip_distance, tolls_amount, fare_amount, total_amount FROM `nyc-tlc.yellow.trips` LIMIT 10 """ client = bigquery.Client(key_path) trips = client.query(sql).to_dataframe() trips.head()
以上となります。読んでいただきありがとうございました。