おつかれさまです!のぶじゃすです。
@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
の実体はこれ
google-auth-library-nodejs/src/auth/googleauth.ts at main · googleapis/google-auth-library-nodejs · GitHub
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
google-auth-library-nodejs/src/auth/jwtclient.ts at main · googleapis/google-auth-library-nodejs · GitHub
ということで GoogleAuthOptions
に JWT
を渡せる手段がありそうか探してみる
export interface GoogleAuthOptions<T extends AuthClient = JSONClient> {
authClient?: T;
JSONClient
という型がある
export type JSONClient =
| JWT
| UserRefreshClient
| BaseExternalAccountClient
| ExternalAccountAuthorizedUserClient
| Impersonated;
JWT
が渡せそうだ!
動いた
ということで以下のようにしたら動きました。納得感持って繋げられたのでよかった。
new BigQuery({
authClient: auth,
projectId: `{env.GCP_PROJECT_ID}`
});
アクセスありがとうございます🙇♂️
ここまで読んでいただき誠にありがとうございました。もしこの記事が役に立ったらはてブや、Twitterのフォローしていただけると大変喜びます😊