1. zaru

    Posted

    zaru
Changes in title
+GoogleAPI SDK ServiceAccount認証コード(Ruby or Node.js)
Changes in tags
Changes in body
Source | HTML | Preview

Google (GSuite) の API を使ってゴニョゴニョするとき、認証が必要になります。今回は Service Account を使ってユーザに依存しない方法で認証をするやり方をメモしておきます。すごく彷徨ったので、未来の自分のために。

Service Account と認証に使う JSON ファイルの作成方法は、巷にあふれているので参照してください。

Ruby

require 'google/apis/admin_directory_v1'
require 'googleauth'

# Service Account 作成時に作った認証 JSON ファイル
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = './client_secrets_sample.json'

scope = [
  'https://www.googleapis.com/auth/admin.directory.user'
]

authorization = Google::Auth.get_application_default(scope)
# sub に組織に所属するだれかのメールアドレスを指定する必要がある
authorization.sub = 'user@example.com'

service = Google::Apis::AdminDirectoryV1::DirectoryService.new
service.authorization = authorization

# あとは利用したいリソースを実行すれば OK

Node.js

import * as googleapis from 'googleapis'

const scope = [
  'https://www.googleapis.com/auth/calendar',
]

const jwtClient = new googleapis.google.auth.JWT(
  null,
  './client_secrets_sample.json',
  null,
  scope,
  'user@example.com', // Ruby と同様に sub 指定をする必要がある
)

jwtClient.authorize()

const calendar = googleapis.google.calendar('v3')

calendar.calendarList.list({
  auth: jwtClient, // 実行時に都度渡す
}).then((res: any) => {
  console.log(res.data.items)
})

Node.js のほうでは application_default を使った認証がうまく行かなかったので普通に JWT で認証させています。