Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8838

[Node.js] 2021年版サービス アカウント認証コード with ドメイン全体の委任

$
0
0

はじめに

2020年10月に G Suite が Google Workspace にリブランドされました。
それとは全く関係ないですが Google Classroom や Google Chat などの Google Apis を Node.js 用クライアントである googleapisを使って呼び出す際に、サービスアカウントに対してドメイン全体の委任を行い OAuth 認証を行う必要があったのですが、情報を見つけるのに大分彷徨ってしまったり、見つけたコードの記法が少々古かったり、ポイントとなる subjectの指定方法がやや不適切だったりしたので備忘を兼ねてコードを残しておきます。

認証コード

一応 googleapis のバージョンは 67.0.0 です。古いバージョン(39.2.0とか)でも動きます。

const{google}=require('googleapis');constcredentials=require('./credentials.json');// サービスアカウント秘密鍵jsonファイル// ドメイン全体の委任で承認されている OAuth スコープの中から必要な分だけ指定するconstscopes=['https://www.googleapis.com/auth/classroom.courses.readonly'];// API 呼出し主体となるアカウントを指定。無指定だとパーミッションエラーになるconstclientOptions={subject:'great-teacher@my-domain.com'};asyncfunctionmain(){constauth=awaitgoogle.auth.getClient({credentials,scopes,clientOptions});constclassroom=google.classroom({version:'v1',auth});// api 単位ではなくグローバルオプションとして認証情報をセットする場合は下記のようにする// const classroom = google.classroom({ version: 'v1' });// google.options({ auth });constresponse=awaitclassroom.courses.list();console.log(JSON.stringify(response));}main().catch(err=>{console.error(err);process.exit(1);});

ポイント

getClient のパラメーターとして subjectを指定した clientOptionsを渡す点が重要です。
これを指定しないと 403 エラー (The caller does not have permission) が返ってきます。
逆に指定した場合はそのアカウントで認証して API を呼び出した場合と同じ結果が返ってきます。
例えば Classroom において教師A が課題1~10、教師B が課題11~20 を作成していた場合、
subjectに教師A のアカウントを指定して courses.courseWork.list()を実行すれば課題1~10が、
教師B のアカウントを指定して実行すれば課題11~20 が返ってきます。

また、ここでは requireを使って秘密鍵 Json ファイルをオブジェクトとして読み込んで credentialsパラメーターに渡していますが、下記のようにファイルパスを keyFileパラメーターに渡しても良いです。

constauth=awaitgoogle.auth.getClient({keyFile:'./credentials.json',scopes,clientOptions});

付録:サービスアカウント作成とドメイン全体の委任

一応この記事だけ見れば良いようにサービスアカウント作成と、そのアカウントに対するドメイン全体の委任の手順を記載しておきます。ドメイン全体の委任についてはGoogle Workspaceの管理者しか実施できず、説明するためのスクショを撮るのもままならなかったりしますので。

OAuth 同意画面の設定

API とサービス> OAuth 同意画面
ここで設定したアプリ名が Google 管理コンソールでドメイン全体の委任を設定した際に表示されます。

OAuth 同意画面 の設定手順

OAuth 同意画面

下記のとおり設定し「作成」または「保存して次へ」

  • UserType:目的に応じて選択
  • アプリ情報
    • アプリ名:適切な名前を入力
    • ユーザーサポートメール:プルダウンから選択
    • アプリのロゴ:空でOK。ある場合は指定
  • アプリのドメイン:全て空でOK。ある場合は指定
  • 承認済みドメイン:追加なしでOK
  • デベロッパーの連絡先情報
    • メールアドレス:適切に指定

oauth-001.png
oauth-002.png

スコープ

なにも設定せず「保存して次へ」
oauth-003.png

テストユーザー

なにも設定せず「保存して次へ」
oauth-004.png

サービスアカウントの準備

API とサービス> 認証情報

サービスアカウントの準備手順

サービスアカウント作成

+ 認証情報の作成から サービス アカウントを選択。
serviceaccount-001.png
下記のとおり設定して「完了」

  • サービス アカウント名:適当に(ここでは domain-delegation)
  • サービス アカウントID:自動設定
  • サービス アカウントの説明:空ないし任意の説明文

serviceaccount-002.png

ドメイン全体の委任を有効化

作成したサービスアカウントの編集ボタンをクリック。
serviceaccount-003.png

ドメイン全体の委任の表示をクリックして展開。
G Suite ドメイン全体の委任を有効にするにチェックを入れて「保存」
serviceaccount-004.png

これにより「OAuth 2.0 クライアント ID」が表示されたことを確認し、再度サービスアカウントの編集ボタンをクリック。
serviceaccount-005.png

鍵を追加プルダウンから 新しい鍵を作成をクリック。
キーのタイプとして「JSON」を選択して「作成」し、秘密鍵Jsonファイルをダウンロード。
このファイルがソースコード上で require('./credentials.json')により取り込んでいた json ファイル。
serviceaccount-006.png
serviceaccount-007.png
serviceaccount-008.png

このサービスアカウント用の OAuth クライアント ID は一覧のコピーボタンから取得する。
serviceaccount-009.png

ドメイン全体の委任の承認

Google 管理コンソール> セキュリティ

ドメイン全体の委任の承認手順

セキュリティ項目一番下の API の制御パネルをクリック。
workspace-001.png

API の制御項目の一番下の ドメイン全体の委任にある「ドメイン全体の委任を管理」をクリック。
workspace-002.png

API クライアント一覧にある「新しく追加」をクリック。
workspace-003.png

クライアント ID にサービスアカウントの OAuth クライアント ID、スコープに利用する Google APIs に必要なスコープを必要な数だけ入力して「承認」。
(カンマ区切りと書いてあるが、1 つ入力するたびにテキストボックスが増えていくので 1 つずつ入力すればよい)
workspace-004.png
workspace-005.png

おわりに

探し方が悪いのかサービスアカウント認証関連の公式ドキュメントを探しても subjectを指定しなきゃダメという情報を見つけられず、参考にさせて頂いた記事を見てようやく認証を通すことができました。
一応 subjectの指定方法は適切な形になっているはずですし、async/await 版でのサンプルにもなっていると思いますので参考になれば。

参考


Viewing all articles
Browse latest Browse all 8838

Trending Articles