case-kの備忘録

日々の備忘録です。最近はGCPやデータ分析系のことを呟きます

OAuth2.0のGCPでのシーケンスや推奨方法について

OAuth2.0のGCPでのシーケンスや推奨方法を調べてみました。OAuth2.0の簡単な概要からGCPで採用している認証方法とOAuth2.0で許可証を発行する場合のシーケンスとサンプルとなります。

OAuth2.0とは?

OAuth2.0はクライアントに許可証を発行する仕組みです。許可証を持っていればリソースサーバからデータの取得が可能で、持っていなければはじかれます。OAuth2.0はOAuth1.0の課題(デスクトップやモバイルアプリ対応など)を改善したものとなっています。
このあたりの記事がわかりやすくまとまっていました。
qiita.com

GCPで採用している認証処理

Googleだとリソースサーバにアクセスするにはいか3つの方法があります。APIキー以外はOAuth2.0が採用されてます。
f:id:casekblog:20190927174836p:plain

公式サイトにやると推奨はサービスアカウントキーを「使ったもののようです。

  • API キーは最も簡単な認証スキームで、ID のみを提供します。共有シークレットによって安全な認証が検証されることはなく、キー制限によって暗黙的な認>証形式が提供されます。
  • サービス アカウントでは公開鍵 / 秘密鍵交換によって ID と認証の両方を提供します。この交換により、API 自体を含めてリソースへのアクセスに使用する認証トークンが生成されます。サービス アカウントの使用は、バックエンドが Cloud API に対して安全に認証するための推奨される方法です。
  • ユーザー アカウントでは、サードパーティ(ユーザー)アカウントに対してチャレンジ レスポンス(パスワード)メカニズムによって ID と認証を提供します。サービス アカウントと同様に、この認証ではリソースへのアクセスに使用する認証トークンが生成されます。一般にユーザー アカウント認証スキームは、API が個人情報にアクセスする必要がある場合にのみ使用します。


cloud.google.com

GCPのOAuth2.0のシーケンス

ユーザー アカウントとサービス アカウントのOAuth2.0のシーケンスは以下となります。

ユーザー アカウント

Cloud SDKを使う方法です。検証ならこちらで十分だと思います。
f:id:casekblog:20190927175911p:plain:w400

サービスアカウント

IDだけでなく公開鍵と秘密鍵で認証してるので安全性が高いです。
You use the client ID and one private key to create a signed JWT and construct an access-token request in the appropriate format.
f:id:casekblog:20190927180004p:plain:w400

developers.google.com

サンプルで試す

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()

cloud.google.com

以上となります。読んでいただきありがとうございました。

参考
qiita.com
boxil.jp