本書を手にとっていただき、ありがとうございます。あなたにとってOAuth2.0の理解を深めるきっかけとなれば幸いです。本書はAuth屋の「雰囲気OAuthシリーズ」第一弾です。まずは本書でOAuth2.0の基本的な用語・概念を学び、「認可のプロトコル」の意味するところを理解していただければと思います。
「ぜんぜんわからない。俺たちは雰囲気でOAuthをやっている。」1または「OAuthまわりはライブラリーにまかせているので、パラメーターを設定するくらいしかやっていない。どんなやりとりが行われているのかわかってない。」というエンジニアに向けてこの本を書きました。具体的には、次の質問に答えられないエンジニアです。
・スコープとはなんですか?
・認可コードは何が行われた証ですか?
・モバイルのアプリケーションの場合、どのグラントタイプを使うべきですか?
・OAuth2.0に関わる概念を整理して理解できます。
・具体的なソフトウェアプロジェクトの構成要素をOAuth2.0のロールにマッピングできるようになります。
・自分のソフトウェアプロジェクトで利用すべきグラントタイプを判断できるようになります。
・利用したいAPIのOAuth関連資料やOAuth2.0の基本仕様を読みこなすための地図が頭の中にできます。
・Google PhotoのAPIを使った画像編集アプリの例を頻繁に挙げることで、具体的にイメージしやすい説明を試みています。
・チュートリアルの章では、curlとブラウザを使って実際に手を動かしながら学べます。
・OAuthの仕様で決められているオプションについては網羅的に説明するのではなく、オーソドックスな一つの例を基に説明しています。
・この本はOAuth1.0と2.0の違いについては説明していません。
・この本はOpenID Connectについては説明していません。OAuth2.0とOpenID Connectを並行して学ぶと混乱するからです。 まずはOAuth2.0についてしっかりと理解し、その後、OpenID Connectとの差分を理解する、というのがOAuth2.0とOpenID Connectの両方を理解するの最短の道だと考えています2。
・この本はOAuth2.0に関する攻撃手段についてはほとんど説明していません。3。
本書で用いる用語について次のように定義します。
OAuth
OAuth2.0のことです。本書ではOAuth1.0は含みません。
基本仕様
本書ではRFC6749(https://tools.ietf.org/html/rfc6749)のことです4。
本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
本書籍は、技術系同人誌即売会「技術書典6」で頒布されたものを底本としています。
この章では「OAuthとは何か」「なぜOAuthが必要なのか」について説明します。
OAuthとは何でしょうか。OAuthの基本仕様であるRFC6749をみてみましょう。アブストラクトの最初の一文が端的にOAuth2.0とは何かを表しています。
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service,
日本語に翻訳すると次の内容になります1。
OAuth2.0はサードパーティアプリケーションによるHTTPサービスへの限定的なアクセスを可能にする認可フレームワークである。
ここに含まれている次の4つの言葉の意味をOAuthの文脈にそって理解すれば、「OAuthとは何か」を理解したことになります。
・サードパーティアプリ
・HTTPサービス
・限定的なアクセス
・認可フレームワーク
ここでは、ある画像編集アプリケーションを例としてこれらの用語を説明します。この画像編集アプリは、画像をGoogle Photoから取得する機能を持っています。定義に登場した用語と画像編集アプリの例の対応を図1.1に示します。
4つの言葉をこの例にそって解説します。
サードパーティアプリ
画像編集アプリが「サードパーティーアプリ」に対応します。Google PhotoのAPIを提供するGoogleからみるとサードパーティだからです。
HTTPサービス
この例ではGoogle PhotoのAPIが「HTTPサービス」に当たります。
限定的なアクセス
画像編集アプリはGoogle PhotoのAさんのデータに対してすべての操作が許されているわけではありません。許されるのは画像のダウンロードのみです。仮に画像編集アプリが画像のアップロードや、画像の削除をしようとした場合はGoogle Photoはそのアクセスを拒否しなければなりません。このようにサードパーティはHTTPサービスに対して一部の操作のみが許されます。
ところで、Google Photoは許可してよい操作をどのように知るのでしょうか。それはAさんの同意によります。OAuthでは「Google Photoにある写真やアルバムなどのデータはAさんのものである。Google Photoのものではない。」と考えます。したがって、画像編集アプリによるAさんのデータへの操作をGoogle Photoが勝手に許可してはいけません。
画像編集アプリが要求する権限一覧をAさんに提示した上で、Aさんから権限の委譲について同意を得る必要があります。その同意が完了してはじめて、Google Photoは画像編集アプリに許可して良い操作を知ることができます。
認可フレームワーク
Google PhotoのAPIはインターネットに公開されているので悪意あるアクセスを前提としなければなりません。Google Photoはすべてのアクセスに対して、許可してよいアクセスかどうかを判断します。この判断に使われるのがアクセストークンです。認可フレームワークとは「アクセストークンの発行方法についてのルール」といえます。そして、このルールにそってアクセストークンを払い出すのが、GoogleのOAuthサービスになります。
各用語の説明が終わったので、もう一度定義に戻りましょう
OAuth2.0はサードパーティアプリケーションによるHTTPサービスへの限定的なアクセスを可能にする認可フレームワークである。
これを例に沿って言い換えると次のとおりです。
OAuth2.0は「画像編集アプリによるGoogle Photoへの限定的なアクセス(Aさんの画像のダウンロードのみ)」を可能にするための「アクセストークンの発行方法のルール」である。
先程の定義には、触れられていないポイントがあります。それは「OAuthを使えば、ユーザーはサードパーティアプリにHTTPサービスのユーザー名、パスワードを教える必要がない」ということです。サードパーティアプリはユーザーのHTTPサービス上のユーザー名、パスワードを知らないにもかかわらず、限定的とはいえHTTPサービスへのアクセスが可能になります。それを可能にする方法は2章以降でじっくり解説するとして、まず、「サードパーティにユーザー名、パスワードを教えると発生する問題」について説明します。それは裏返すと「OAuthはなぜ必要か」という説明でもあります。
これも画像編集アプリの例で説明します。OAuthがなければ、Google Photoのユーザー名、パスワードを画像編集アプリに教えるしかありません。「画像編集アプリからGoogle Photoに継続的にアクセスする必要があること」、「ユーザーに何度もパスワードを入力させるのはわずらわしいこと」という理由から、パスワードは画像編集アプリに保存されるでしょう。その結果、「何が起こりうるか」、そして「OAuth2.0を利用することでそれがどのように解決するか」について説明します。
問題1
AさんのGoogle Photoでのユーザー名、パスワードを画像編集アプリが保持している場合、画像編集アプリができることはGoogle Photoからの画像のダウンロードだけではありません。画像の削除、アップロードなどAさんができることは何でもできてしまいます。仮に画像編集アプリが悪意ある開発者によって作られたアプリだとします。その場合、画像編集アプリはGoogle PhotoのAさんのデータに対してあらゆる操作を勝手に行うことが可能になります2。
OAuth2.0を利用すれば画像編集アプリは、Aさんが委譲した権限のみを有しています。先の例では画像編集アプリはGoogle Photoからの画像のダウンロードだけを行えます。仮に、悪意あるアプリであっても、ダウンロードしかできないため影響は最低限に抑えられます。
また、Aさんは画像編集アプリに対する権限委譲についてGoogle Photoから同意を求められるので、そのときに権限が適切であるかどうかを確認することができます。
問題2
画像編集アプリは悪意あるものによって作成されたアプリで、勝手にユーザーの画像を収集していることが判明しました。画像編集アプリがユーザー名、パスワードを保持している場合、Aさんが画像編集アプリからのアクセスを遮断するためにはGoogle Photoのパスワードを変更するしか手がありません。この結果、Aさんが利用する他のサードパーティアプリからもGoogle Photoにアクセスできなくなってしまいます。OAuth2.0を利用すれば、AさんはGoogleの管理画面から画像編集アプリのアクセスを拒否することができます。
問題3
画像編集アプリがユーザー名、パスワードを保持している場合、画像編集アプリが攻撃を受けるとユーザー名と、パスワードが漏洩する可能性があります。OAuth2.0を利用すれば画像編集アプリにはGoogle Photoのユーザー名、パスワードが保存されないので、漏洩する可能性はありません。アクセストークンが漏洩する可能性がありますが、アクセストークンには有効期限があり、かつ、限定した権限しかないので影響は限定的です。