30
32

More than 5 years have passed since last update.

サービスアカウントの認証手順

Posted at

はじめに

概要

外部のプログラムからGoogleAPIでGoogleアカウントのリソースにアクセスするためには、GoogleのサービスアカウントでOAuth2の認証が必要です。

ここでは認証の手順について書いていきます。

必要なもの

・Googleアカウント
・Google API client Library(今回はpython)

認証の仕組み

OAuth2.png
サービスアカウントの秘密鍵でJWT(Json Web Token)を生成して、JWTでAPI用のトークンを取得します。

プロジェクトの選択or作成

google developer console
Developer consoleからプロジェクト選択or新規作成

使用するAPIの有効化

API Managerのライブラリから利用するAPIを選択し、有効にする。

サービスアカウント作成

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

認証情報 ▷ 認証情報を作成 ▷ 「サービスアカウントキー」 ▷ 新しいサービスアカウント ▷ JSON ▷ 作成

※作成ボタンを押すと「秘密鍵を含むJSONファイル」が自動的にダウンロードされる。その後ダウンロード出来ないので注意。

クライアントIDの作成(管理者権限が必要な場合)

認証情報 ▷ サービスアカウントの管理 ▷ 作成したサービスアカウントの右端の点を押す ▷ 編集 ▷ Gsuiteドメイン全体の権限を委任するにチェック

クライアントIDが表示できるようになっていることを確認

サービスアカウントにドメイン全体の権限を委任

※管理者権限が必要な場合の手順です

管理コンソールにadminでログイン
セキュリティ→もっと見る→詳細設定→「API クライアント アクセスを管理する」

サービスアカウントの「クライアントID」、利用するAPIの「scope」を入力して承認。

(JWTのclaimに"sub":"user_email"の追加が必要。)

JWTの生成

作成したサービスアカウントの秘密鍵を用いてJWTを作成します。

$curl -d "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion="ここにJWT" https://www.googleapis.com/oauth2/v4/token

{
  "access_token" : "ya29.Elo4BOPu_8xrvZdah28zt3dgrX-x87vdy_BbFVt07XEm83d1S6-uZHBOCyKJdafHwIdV3ZiVDRdqhP9TpE8Vzo6_QZeAofp_Z5rMK_uwf-q_h_yrNcgTccdgSkY",
  "expires_in" : 3600,
  "token_type" : "Bearer"
}
$curl -H 'Authorization: Bearer ya29.Elo4BNIcKX8SEqyTg7CwGrp32W75pUddHQJIvB_mtk31-qnuz8N8MGOkZjeOLykuch8ATNo2jfa-hHOpNOBFHVH7lUS8MRNTN6YQj_kpCN4afoZAH_TPimXxEbA'  https://www.googleapis.com/admin/directory/v1/users/hoge@example.com 

API client Library for python で実装する場合

client library のインストール

$ pip install --upgrade google-api-python-client

Successfully installed google-api-python-client-1.6.2 httplib2-0.10.3 oauth2client-4.1.2 pyasn1-0.2.3 pyasn1-modules-0.0.9 rsa-3.4.2 six-1.10.0 uritemplate-3.0.0  ⇦くっついてくるもの

コード

credentials.py
from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http


scopes = ['https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.orgunit']
credentials = ServiceAccountCredentials.from_json_keyfile_name('/tmp/googleapi/serviceaccount.json', scopes=scopes)
delegated_credentials = credentials.create_delegated('admin@example.com')  # 権限を委任
http_auth = credentials.authorize(Http())

credentialsオブジェクトを生成することで資格情報が保持される。

30
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
32