パスワードを渡さずに許可するOAuth

OAuthは、パスワードを渡さずに「このサービスが私の代わりに操作してよい」という許可を安全に伝えるための仕組みです。

Tatoediaの読者モブ
読者さん

「Googleでログイン」を押したら、このアプリに Google のパスワードを教えたことになる?

Tatoediaの案内役
案内役

ならないよ。パスワードは Google の画面で入れただけで、アプリには届いていないんだ。

新しいアプリを使い始めるときに見かける、「Googleでログイン」「GitHubでログイン」のボタン。これを押しても、あなたの Google のパスワードはアプリに渡りません。代わりに Google が「このアプリに、この範囲だけアクセスを許可する」という証明を発行しています。この許可の受け渡しの仕組みが OAuth です。

ホテルのカードキーに近いものがあります。お客さんはマスターキーを誰かに渡したりしません。代わりにフロントで「201号室だけ開けられるカード」を作ってもらい、それをスタッフに預ける。スタッフはその部屋には入れますが、ほかの部屋は開けられません。カードには期限があり、用が済めば無効にできます。

「許可する」を押したときに裏で起きていること

Googleカレンダーと予定を同期するアプリを例にすると、流れはこうなります。

  1. アプリが「Googleでログイン」ボタンを表示する
  2. 利用者が Google の画面でログインし、「このアプリにカレンダーの読み取りを許可する」と承認する
  3. Google がアプリに許可証(アクセストークン)を渡す
  4. アプリはそのトークンを使って、許可された範囲だけカレンダーにアクセスする

パスワードは Google の画面で入力するだけで、アプリには渡りません。会計ソフトが銀行のデータを自動で取り込む、開発ツールが Git リポジトリを操作する、といった連携も同じ仕組みで動いています。

承認画面で見ておきたいところ

承認の画面には、アプリが求めている範囲(スコープ)が並んでいます。カレンダーを同期したいだけのアプリが、メールの送信や連絡先の編集まで求めていないか。ボタンを押す前に、ここだけは目を通してください。

許可したあとで使わなくなったアプリは、Google などのアカウント設定から許可を取り消せます。取り消せば、アプリはもうアクセスできません。

作る側が勘違いしやすいこと

OAuth は「誰かに代わって操作してよい」という許可の仕組みで、それだけでは「あなたは誰か」を確かめる認証の代わりにはなりません。「Googleでログイン」の実装では、多くの場合、OAuth の上に「誰が認証したか」の情報を乗せる OpenID Connect という仕様が組み合わされています。

求めるスコープは必要最小限にする。アクセストークンには有効期限を設け、不要になったら取り消す。利用者が許可を取り消せる画面を用意する。こうした設計に加えて、偽の承認画面へ誘導するフィッシングへの備えも必要です。