本文へ移動
Step 04 · Sign-in with Google

Google OAuth クライアント発行Google sign-in

松葉では Google アカウントによるログインを採用しています。社内ユーザ(@example.com)も社外ユーザ(任意の Google アカウント)も同じ OAuth クライアントを共用し、サーバ側でドメインを判定して「社内か社外か」を振り分けます。本手順では、Google が松葉に出す「ログイン許可証」となるクライアント ID + Secret を発行しました。

OAuth とは: 利用者が Google にログインした状態で「松葉に Google アカウント情報の利用を許可します」と一度同意すると、以降は松葉が Google からその利用者の身分証明を貸してもらえる仕組みです。kintone の「シングルサインオン(SSO)」と同じ考え方です。

所要時間: 20 分 前提条件: Step 00 完了 後続: Step 06(Secret Manager 登録)
01

OAuth 同意画面のブランド設定Consent screen branding

利用者が初回ログイン時に見る「松葉にアクセスを許可しますか?」の画面(OAuth 同意画面)に、松葉のアプリ名・ロゴ・各種 URL を登録しました。フィッシング対策と利用者の安心感のため、ここの設計は手抜きできません。

02

取得するスコープ(権限範囲)OAuth scopes

スコープとは、利用者から「これだけは見せてもよい」と許可してもらう情報の範囲です。松葉はメールアドレスと表示名のみで完結するため、機微なスコープ(Drive 等)は一切要求しません。Google の審査が不要な、軽量なスコープ構成です。

スコープ意味本番審査
userinfo.email利用者のメールアドレスを取得不要
userinfo.profile表示名 + プロフィール画像を取得不要
openidOpenID Connect(標準ログインプロトコル)不要
https://www.googleapis.com/auth/driveDrive ファイル操作本クライアントでは 要求しない(Drive 同期は別 SA で実施)

機微スコープを避ける設計: もし auth/drive をこのクライアントで要求すると、Google の手厚いセキュリティ審査(数週間〜数ヶ月)が必要になり、松葉単独でリリースできなくなります。Drive 操作はこのログインクライアントではなく、Step 03 で作った sync の実行 SA に集約することで、ログイン経路と Drive 操作経路を構造的に切り離しました。

03

ログイン経路の流れSign-in flow

図 · 社内 / 社外を 1 クライアントで振り分ける流れ
社内ユーザ@example.com社外ユーザ@gmail.com 等 任意の Google アカウント/sign-in/internalhd=example.com 強制/sign-in/externalhd 指定なしOAuth クライアントmatsuba-web · 1 個で共用redirect: /api/auth/callback/googleサーバ側でドメイン判定email が @example.com なら internal、そうでなければ externalinternal セッションMFA 任意external セッションOTP MFA 必須

同じ OAuth クライアントで社内・社外を扱える工夫: 入口ルートを /sign-in/internal と /sign-in/external の 2 つに分け、社内ルートでは Google 側に hd=example.com(ドメイン限定パラメータ)を強制送信します。Google 側で @example.com 以外のアカウントを選べないようにする仕組みです。社外ルートでは hd を送らず任意 Google アカウントを受け入れます。最終的にはサーバ側で email ドメインを再判定して内外を確定します。

04

承認済みリダイレクト 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 参照)。

05

後続手順に渡す出力Outputs

取得した値Secret Manager 名使うサービス
クライアント IDmatsuba-google-client-idmatsuba-api(Better Auth Google プロバイダ)
クライアント Secretmatsuba-google-client-secretmatsuba-api(Better Auth Google プロバイダ)