Google OAuth クライアント発行Google sign-in
松葉では Google アカウントによるログインを採用しています。社内ユーザ(@example.com)も社外ユーザ(任意の Google アカウント)も同じ OAuth クライアントを共用し、サーバ側でドメインを判定して「社内か社外か」を振り分けます。本手順では、Google が松葉に出す「ログイン許可証」となるクライアント ID + Secret を発行しました。
OAuth とは: 利用者が Google にログインした状態で「松葉に Google アカウント情報の利用を許可します」と一度同意すると、以降は松葉が Google からその利用者の身分証明を貸してもらえる仕組みです。kintone の「シングルサインオン(SSO)」と同じ考え方です。
OAuth 同意画面のブランド設定Consent screen branding
利用者が初回ログイン時に見る「松葉にアクセスを許可しますか?」の画面(OAuth 同意画面)に、松葉のアプリ名・ロゴ・各種 URL を登録しました。フィッシング対策と利用者の安心感のため、ここの設計は手抜きできません。
取得するスコープ(権限範囲)OAuth scopes
スコープとは、利用者から「これだけは見せてもよい」と許可してもらう情報の範囲です。松葉はメールアドレスと表示名のみで完結するため、機微なスコープ(Drive 等)は一切要求しません。Google の審査が不要な、軽量なスコープ構成です。
| スコープ | 意味 | 本番審査 |
|---|---|---|
userinfo.email | 利用者のメールアドレスを取得 | 不要 |
userinfo.profile | 表示名 + プロフィール画像を取得 | 不要 |
openid | OpenID Connect(標準ログインプロトコル) | 不要 |
https://www.googleapis.com/auth/drive | Drive ファイル操作 | 本クライアントでは 要求しない(Drive 同期は別 SA で実施) |
機微スコープを避ける設計: もし auth/drive をこのクライアントで要求すると、Google の手厚いセキュリティ審査(数週間〜数ヶ月)が必要になり、松葉単独でリリースできなくなります。Drive 操作はこのログインクライアントではなく、Step 03 で作った sync の実行 SA に集約することで、ログイン経路と Drive 操作経路を構造的に切り離しました。
ログイン経路の流れSign-in flow
同じ OAuth クライアントで社内・社外を扱える工夫: 入口ルートを /sign-in/internal と /sign-in/external の 2 つに分け、社内ルートでは Google 側に hd=example.com(ドメイン限定パラメータ)を強制送信します。Google 側で @example.com 以外のアカウントを選べないようにする仕組みです。社外ルートでは hd を送らず任意 Google アカウントを受け入れます。最終的にはサーバ側で email ドメインを再判定して内外を確定します。
承認済みリダイレクト URIAuthorized redirects
OAuth クライアントは「ここに戻ってくる URL のみ受け付ける」というホワイトリストを持ちます。攻撃者が偽サイトに認可コードを盗ませる経路を構造的に防ぐ仕組みです。
| 用途 | URL |
|---|---|
| 本番(本体ホスト) | https://portal.example.com/api/auth/callback/google |
| ローカル開発 | http://localhost:3000/api/auth/callback/google |
共有リンクホスト inbox.portal.example.com は対象外: 共有リンクは受信者がログインせずに開く(OTP / パスワード保護のみ)設計のため、OAuth クライアントの承認済み URI には含めません。本体 API の認証を経由しないルートでだけ動かす徹底です(Step 09 参照)。
後続手順に渡す出力Outputs
| 取得した値 | Secret Manager 名 | 使うサービス |
|---|---|---|
| クライアント ID | matsuba-google-client-id | matsuba-api(Better Auth Google プロバイダ) |
| クライアント Secret | matsuba-google-client-secret | matsuba-api(Better Auth Google プロバイダ) |