OAuthとは?「Googleでサインイン」と委任アクセスの仕組み
OAuthは、ユーザーがあるアプリに、別のサービス上のアカウントへの限定的なアクセスを、パスワードを渡さずに許可できるようにするオープンな標準です。「Googleカレンダーに接続」をクリックして、「このアプリに予定の閲覧を許可しますか?」という画面が出てきたら、それがOAuthです。アプリが受け取るトークンは、あなたが承認した内容だけに対応しており、いつでも取り消せます。同じ仕組みに、OpenID Connectという追加の層を組み合わせると、「Googleでサインイン」などのボタンになります。
AIでアプリを作るときにOAuthが大切な理由
アプリを作るとき、OAuthは主に2つの場面で登場します。
- ソーシャルログイン。 ユーザーに、新しいパスワードを作らせるのではなく、「Googleでサインイン」(またはApple、Microsoft、GitHub)を使ってほしい場合です。アプリにログインを追加する方法を参照してください。
- ユーザーの他のサービスのアカウントへの接続。 アプリが、ユーザーのカレンダーを読んだり、ソーシャルアカウントに投稿したり、クラウドドライブのファイルを取得したり、会計データを同期したりする必要がある場合です。
どちらの場合も、AIビルダーがコードを書けますが、一部の手順はあなたにしかできません。たとえば、プロバイダーで開発者向けのアプリを作成すること、クライアントIDとクライアントシークレットを取得すること、コールバックURLを登録すること、そして一部の権限については、プロバイダーの審査を通すことです。OAuthの仕組みを知っておくと、これらの手順と、それによって起きるエラーが、ずっとわかりやすくなります。ログイン全体の概要は、認証とはを参照してください。
身近なたとえ
ホテルのキーカードを考えてみてください。チェックインのとき、フロントが本人確認をし、部屋とジムだけを開けられるカードを渡します。他の部屋やスタッフ専用エリアは開きません。カードには、パスポートの情報は入っていません。紛失した場合は、フロントがそのカードを無効にし、新しいカードを発行します。
- フロントは認可サーバー(Googleのサインインページ)にあたります。
- 本人確認は、あなたがGoogleにログインすることです。
- キーカードはアクセストークンにあたります。
- **「部屋とジムだけ」**は、あなたが承認したスコープです。
- チェックアウトは、トークンの期限切れ、またはあなたがアクセスを取り消すことにあたります。
あなたが使っているアプリは、あなたのGoogleのパスワードを見ることはなく、キーカードだけを見ます。
OAuthの仕組みをステップごとに
Webアプリで最も一般的な流れは、認可コードフローです。ユーザーが予定管理アプリにGoogleカレンダーを接続するときに起こることは、次のとおりです。
- クリック。 ユーザーが「Googleカレンダーに接続」をクリックします。
- プロバイダーへのリダイレクト。 アプリは、ブラウザをGoogleに送ります。その際、アプリのクライアントID、求めるスコープ(カレンダーの予定の読み取り)、Googleがユーザーを戻すべきリダイレクトURIを伝えます。
- ログインと同意。 ユーザーがGoogleにサインインし(まだであれば)、アプリが求めている内容を一覧にした同意画面を見ます。「許可」をクリックします。
- コードを持って戻る。 Googleが、短時間だけ有効な一度限りの認可コードとともに、ブラウザをアプリのリダイレクトURIに戻します。
- サーバーで交換する。 アプリのサーバーが、そのコードとクライアントシークレットを直接Googleに送り、アクセストークン(多くの場合、リフレッシュトークンも)を受け取ります。
- APIを使う。 サーバーがアクセストークンを使ってGoogleカレンダーのAPIを呼び出し、ユーザーの予定を取得します。
手順4のコールバックは、次のようなものです。
https://yourapp.com/auth/google/callback?code=4/0Adeu5B...&state=x7Kq9
手順5でのトークンのレスポンスは、次のようなJSONです。
{
"access_token": "ya29.a0Af...",
"expires_in": 3599,
"refresh_token": "1//0gL...",
"scope": "https://www.googleapis.com/auth/calendar.readonly",
"token_type": "Bearer"
}
設計上の重要な点は、トークンの交換がサーバー間で行われることです。そのため、クライアントシークレットとトークンがブラウザを通過する必要はありません。
OAuth、OpenID Connect、自前のログインの比較
| 何に答えるか | 例 | |
|---|---|---|
| OAuth 2.0 | 「このアプリはユーザーに代わって何をしてよいか?」(認可) | ユーザーのカレンダーを読む |
| OpenID Connect(OIDC) | 「このユーザーは誰か?」(認証)。OAuthの上に構築される | 「Googleでサインイン」で確認済みのメールアドレスを取得する |
| 自前のログイン | 「このパスワードはこのアカウントの正しいものか?」 | メールアドレスとパスワード(ハッシュ化して)をデータベースに保存する |
多くのアプリはこれらを組み合わせます。メールアドレスとパスワードによるログインに、OIDCによる「Googleでサインイン」を加え、さらに他のサービスへの個別のOAuth接続を持つ、という形です。
主な用語
| 用語 | 意味 |
|---|---|
| プロバイダー / 認可サーバー | ユーザーがログインし、アクセスを許可する先のサービス。Google、Microsoft、GitHubなど。 |
| クライアント | プロバイダーに登録された、あなたのアプリ。 |
| クライアントID | プロバイダーにおける、あなたのアプリの公開の識別子。 |
| クライアントシークレット | プロバイダーにおける、あなたのアプリの非公開のパスワード。サーバー側のみ。 |
| スコープ | 「カレンダーの読み取り」や「メールアドレスの閲覧」など、特定の権限。 |
| 同意画面 | ユーザーが、求められているスコープを確認して承認するページ。 |
| リダイレクトURI / コールバックURL | プロバイダーがユーザーを戻す先。事前に登録され、完全に一致している必要がある。 |
| アクセストークン | APIを呼び出すための、有効期限の短い認証情報。 |
| リフレッシュトークン | 新しいアクセストークンを取得するための、より長く有効な認証情報。パスワードと同じように保存すること。 |
| IDトークン | OIDCにおいて、ユーザーが誰であるかを記述する、署名されたトークン。 |
| PKCE | 傍受されたコードを使われないようにする追加のチェック(「証明キー」)。すべてのクライアントに推奨。 |
| state | 偽造されたリクエストから流れを守るための、ランダムな値。 |
よくある誤解
- 「OAuthはログインの仕組みだ」。 素のOAuthはアクセスを与えるものです。本人確認を担当するのはOpenID Connectです。アクセストークンを、誰であるかの証明としてそのまま使うと、実際にセキュリティ上のバグを生んだことがあります。
- 「アプリは私のパスワードを受け取る」。 そんなことはありません。それがポイントです。
- 「スコープを多く求めても無害」。 ユーザーは広範な要求を警戒します。また、Googleのようなプロバイダーは、機密性の高い、または制限されたスコープについてアプリの審査を求めることがあります。必要なものだけを求めてください。
- 「クライアントシークレットはフロントエンドに置いてよい」。 ブラウザのコードに入れたものは、すべて公開されます。サーバー側の秘密情報に保存してください。
- 「テストで動いたから、本番でも動く」。 プロバイダーは、審査前のアプリを制限することがよくあります(たとえば、登録されたテストユーザーだけ、など)。また、本番ドメインのリダイレクトURIは、別途登録する必要があります。
- 「トークンは永久に有効」。 アクセストークンはすぐに期限切れになり、ユーザーはアクセスを取り消せます。アプリは、その両方を適切に扱う必要があります。
AIビルダーに頼むこと
- 「OpenID Connectを使って『Googleでサインイン』を追加して。整備されたログイン用ライブラリを使い、OAuthの流れを自分で書かないで。」
- 「PKCEを併用した認可コードフローを使い、
stateパラメーターを確認して。」 - 「クライアントIDとクライアントシークレットは、サーバー側の環境変数から読み込んで。」
- 「必要なスコープだけを求めて。カレンダーは読み取り専用にして。」
- 「プレビュー、公開URL、独自ドメインのそれぞれについて、プロバイダーのコンソールに登録すべきリダイレクトURLをすべて教えて。」
- 「リフレッシュトークンはデータベースに暗号化して保存して。期限切れまたは取り消されたトークンの場合は、ユーザーに再接続を求めて。」
- 「ユーザーが設定ページから連携を解除できるようにして。」
MythexとOAuth
Mythexには、作ったアプリのエンドユーザー向けの組み込みのログイン機能はありません。ドキュメントでは、自分で用意する方式が説明されています。認証ライブラリやホスト型のプロバイダーを選び、そのキーをプロジェクトの秘密情報として保存すると、エージェントがコードを書きます。このための開始用のプロンプトは、認証を追加するレシピにあります。また、Mythex自体でもOAuthに出会うことがあります。Googleでサインアップでき、リポジトリ同期のためのGitHub接続にはGitHubのOAuthを使い、MythexにMCPで接続するAIクライアントは、OAuthの同意ページを経由します。詳しくは、認証とはと二要素認証とはを参照してください。
よくある質問
OAuthをかんたんに言うと何ですか?
OAuthは、ユーザーが、あるアプリに別のサービス上のアカウントへのアクセスを許可するための標準的な方法です。たとえば、予定管理アプリにGoogleカレンダーを読ませる場合などです。その際、パスワードを渡す必要はありません。ユーザーは特定の権限を承認し、アプリはその権限だけに使えるトークンを受け取ります。
OAuthは「Googleでサインイン」と同じものですか?
「Googleでサインイン」は、OAuth 2.0と、その上に乗るOpenID Connectという層によって作られています。OpenID Connectは、アプリにユーザーが誰であるかを伝える標準的な方法を追加します。OAuth単体はアクセスを与える仕組みであり、OpenID Connectがそれをログインに変えるものです。
OAuthのアクセストークンとは何ですか?
アクセストークンは、アプリがサービスのAPIにアクセス権を得ていることを証明するために送る認証情報です。通常は有効期限が短く、ユーザーが承認したスコープ(権限の範囲)に限定されています。リフレッシュトークンが発行されている場合は、アプリはユーザーに再度たずねることなく、新しいアクセストークンを取得できます。
redirect_uri_mismatchとはどういう意味ですか?
サインインの際にアプリが送ったコールバックURLが、プロバイダーの開発者コンソールに登録されたものと完全に一致していないという意味です。アプリが動くアドレスごとに、正確なURL(https、ドメイン、パス、末尾のスラッシュの有無を含む)を追加してください。
OAuthは安全ですか?
正しく実装されていれば、OAuth 2.0は広く使われており安全です。認可コードフロー(PKCEを併用)、正確なリダイレクトURL、stateパラメーター、クライアントシークレットとトークンをサーバー側で保持する、といった方法を使います。問題のほとんどは実装上の手抜きから生じるため、整備されたライブラリを使うことが推奨されています。