「Googleでログイン」を押したら、このアプリに Google のパスワードを教えたことになる?
ならないよ。パスワードは Google の画面で入れただけで、アプリには届いていないんだ。
新しいアプリを使い始めるときに見かける、「Googleでログイン」「GitHubでログイン」のボタン。これを押しても、あなたの Google のパスワードはアプリに渡りません。代わりに Google が「このアプリに、この範囲だけアクセスを許可する」という証明を発行しています。この許可の受け渡しの仕組みが OAuth です。
ホテルのカードキーに近いものがあります。お客さんはマスターキーを誰かに渡したりしません。代わりにフロントで「201号室だけ開けられるカード」を作ってもらい、それをスタッフに預ける。スタッフはその部屋には入れますが、ほかの部屋は開けられません。カードには期限があり、用が済めば無効にできます。
「許可する」を押したときに裏で起きていること
Googleカレンダーと予定を同期するアプリを例にすると、流れはこうなります。
- アプリが「Googleでログイン」ボタンを表示する
- 利用者が Google の画面でログインし、「このアプリにカレンダーの読み取りを許可する」と承認する
- Google がアプリに許可証(アクセストークン)を渡す
- アプリはそのトークンを使って、許可された範囲だけカレンダーにアクセスする
パスワードは Google の画面で入力するだけで、アプリには渡りません。会計ソフトが銀行のデータを自動で取り込む、開発ツールが Git リポジトリを操作する、といった連携も同じ仕組みで動いています。
承認画面で見ておきたいところ
承認の画面には、アプリが求めている範囲(スコープ)が並んでいます。カレンダーを同期したいだけのアプリが、メールの送信や連絡先の編集まで求めていないか。ボタンを押す前に、ここだけは目を通してください。
許可したあとで使わなくなったアプリは、Google などのアカウント設定から許可を取り消せます。取り消せば、アプリはもうアクセスできません。
作る側が勘違いしやすいこと
OAuth は「誰かに代わって操作してよい」という許可の仕組みで、それだけでは「あなたは誰か」を確かめる認証の代わりにはなりません。「Googleでログイン」の実装では、多くの場合、OAuth の上に「誰が認証したか」の情報を乗せる OpenID Connect という仕様が組み合わされています。
求めるスコープは必要最小限にする。アクセストークンには有効期限を設け、不要になったら取り消す。利用者が許可を取り消せる画面を用意する。こうした設計に加えて、偽の承認画面へ誘導するフィッシングへの備えも必要です。