おつかれさまです!のぶじゃすです。
@google-cloud/bigquery を実行する際にJWT認証で実行出来るようにしたい。サービスアカウントを使って利用していたりするとJWT認証じゃないと厳しい場面が発生する。(credentialファイルを置けないとか)
具体的に今回やりたいのは、googleapis と同様に
const auth = new google.auth.JWT( env.GOOGLE_EMAIL, undefined, env.GOOGLE_PRIVATE_KEY, [ "https://www.googleapis.com/auth/drive", ] ); export const driveService = google.drive({ version: "v3", auth });
みたいな感じで BigQuery のAPIを実行したい。
結論
まずは結論から。これで動きました。調べた事を後述していますので気になる方はどうぞ。
const auth = new google.auth.JWT( env.GOOGLE_EMAIL, undefined, env.GOOGLE_PRIVATE_KEY, [ "https://www.googleapis.com/auth/drive", ] ); new BigQuery({ authClient: auth, projectId: `{env.GCP_PROJECT_ID}` });
BigQuery の API がどうなっているのか調べてみる
BigQuery クラスの constructor は @google-cloud/common
の GoogleAuthOptions
を継承している
export interface BigQueryOptions extends GoogleAuthOptions
nodejs-bigquery/src/bigquery.ts at main · googleapis/nodejs-bigquery · GitHub
@google-cloud/common
の GoogleAuthOptions
の実体は google-auth-library
の GoogleAuthOptions
export {GoogleAuthOptions} from 'google-auth-library';
nodejs-common/src/index.ts at main · googleapis/nodejs-common · GitHub
google-auth-library
の GoogleAuthOptions
の実体はこれ
googleapis のAPIがどうなっているのか調べてみる
Drive
クラスの constructor
は googleapis-common
の GlobalOptions
を利用している
constructor(options: GlobalOptions, google?: GoogleConfigurable) {
google-api-nodejs-client/src/apis/drive/v3.ts at main · googleapis/google-api-nodejs-client · GitHub
googleapis-common
の GlobalOptions
の auth
は google-auth-library
の OAuth2Client や GoogleAuth を渡せる
export interface GlobalOptions extends MethodOptions { auth?: GoogleAuth | OAuth2Client | BaseExternalAccountClient | string; }
nodejs-googleapis-common/src/api.ts at main · googleapis/nodejs-googleapis-common · GitHub
new google.auth
を探ってみる
googleapis-common
の AuthPlus
が google.auth
の実体
export class GoogleApis extends GeneratedAPIs { private _discovery = new Discovery({debug: false, includePrivate: false}); auth = new AuthPlus();
google-api-nodejs-client/src/googleapis.ts at main · googleapis/google-api-nodejs-client · GitHub
AuthPlus
の JWT
は google-auth-library
の JWT
export class AuthPlus extends GoogleAuth { JWT = JWT;
nodejs-googleapis-common/src/authplus.ts at main · googleapis/nodejs-googleapis-common · GitHub
google-auth-library
の JWT
は OAuth2Client
の継承
export class JWT extends OAuth2Client
ということで GoogleAuthOptions
に JWT
を渡せる手段がありそうか探してみる
export interface GoogleAuthOptions<T extends AuthClient = JSONClient> { /** * An `AuthClient` to use */ authClient?: T;
JSONClient
という型がある
export type JSONClient = | JWT | UserRefreshClient | BaseExternalAccountClient | ExternalAccountAuthorizedUserClient | Impersonated;
JWT
が渡せそうだ!
動いた
ということで以下のようにしたら動きました。納得感持って繋げられたのでよかった。
new BigQuery({ authClient: auth, projectId: `{env.GCP_PROJECT_ID}` });
アクセスありがとうございます🙇♂️
ここまで読んでいただき誠にありがとうございました。もしこの記事が役に立ったらはてブや、Twitterのフォローしていただけると大変喜びます😊