OAuth2
はじめに
OAuth2.0 とはサードパーティアプリケーションによる HTTP サービスへの限定的アクセスを可能にする認可フレームワークである。
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service,
本ブログでは具体例を交えて OAuth2.0 の概観を理解することを目的とする。
前提
具体例として画像編集アプリを使う。 この画像編集アプリは機能として編集した画像を Google Photo に upload することができるシンプルなアプリである。
OAuth2.0 の定義を例に当てはめると下記のようになる。
サードパーティアプリケーション 画像編集アプリ
HTTP サービス Google Photo API のこと
限定的なアクセス 画像編集アプリは Google Photo の user のデータに対して全ての処理が許されるわけではなく、upload することのみが許されるべきである。 そのため画像編集アプリは user の許可を得た限定的な操作のみ行えるということである。
認可フレームワーク Google Photo API は全てのアクセスに対して有効なものかどうかを確認する。その際にアクセストークンと呼ばれるものが使われる。 認可フレームワークとはアクセストークンの発行方法についてのルールという事ができる。
用語、登場人物
リソースオーナー 画像編集アプリでいうところの User。自らの Google Photo に対する所有権を持つ。
リソースサーバー データや機能を提供するサービスのこと。多くの場合は API などを指す。例では Google Photo のこと。
サードパーティプリ、クライアント 画像編集アプリのこと。リソースサーバーにアクセスして何らかの処理をするもの。
認可サーバー アクセストークンを発行するサーバー。例では Google Photo の OAuth API。
4 つのロールの関係
- クライアントは認可サーバーに対して
リソースへのアクセス権
を要求 - 認可サーバーは
クライアントへのアクセス圏の移譲
についてリソースオーナーの意思を確認する - リソースオーナーはアクセス権の移譲について同意
- 認可サーバーはアクセス権が移譲された証(アクセストークン)を発行
- クライアントはアクセストークンを持ってリソースへアクセスを試みる
OAuth のエンドポイント
OAuth のフローには認可エンドポイント、トークンエンドポイント、リダイレクトエンドポイントの 3 つの重要なエンドポイントがある。
認可エンドポイント
認可エンドポイントとは認可サーバーによって提供されるエンドポイントで認可コードの発行が主な役割。 ユーザー名とパスワードの入力などによってリソースオーナーの認証が行なわれ、リソースへのアクセス権をクライアントに移譲すること同意を求められる。 同意が取れれば認可コードがリダイレクトエンドポイントに送られる。 Google, Facebook を用いてログインをなどをする際に飛ばされる各サービスのログイン画面。
リダイレクトエンドポイント
リダイレクトエンドポイントはクライアントが提供する認可サーバーから認可コードを受け取るために使われるものである。 認可サーバーはリソースオーナーの権限移譲の同意が行われるとステータスコード 302 のレスポンスを返してブラウザをリダイレクトエンドポイントに認可コードの値と一緒にリダイレクトする。
トークンエンドポイント
トークンエンドポイントは認可サーバーによって提供される。 認可コードを受け取ったクライアントはそれと共に必要なパラメーターを渡してトークンエンドポイントにリクエストを投げることでアクセストークンを取得できる。 トークンエンドポイントでは Basic 認証によってクライアントのアイデンティがクライアント ID とクライアントシークレットを用いて確認される。 クライアントシークレットは認可サーバーにクライアントを事前登録する際に発行される。
OAuth のトークン
OAuth に関連するトークンとしてアクセストークンとリフレッシュトークンがある。 また認可コードもトークンの一種と言える。
アクセストークン
アクセストークンはクライアントからリソースサーバーに対するアクセスに利用される。 アクセストークンにはリソースに対する権限が紐づいており、リソースサーバーはリクエストの内容とアクセストークンの権限が一致している場合、アクセスを許可する。 OAuth のアクセストークンは Bearer Token であるためリソースサーバーはアクセストークンの送信元を確認しない。つまりアクセストークンを持ってさえいればリソースにアクセスする事が可能になる。 アクセストークンの重要な属性としてスコープと有効期限というものがある。
スコープ
スコープとはアクセストークンに紐づくアクセス圏を細かくコントロールするための仕組みである。 例えば Google PhotoAPI の場合であれば写真の閲覧権限、編集権限などをスコープとしてアクセス権限に紐づける。
アクセストークンに紐づけたいスコープの指定はクライアントから認可サーバーへのリクエスト時点
で既に行われる。
スコープを適切に設定することでアクセストークンが流出した際の影響を最小限にとどめることができる。
有効期限
アクセストークンには有効期限があり、有効期限を過ぎたアクセストークンを付与したアクセスはリソースサーバーによって拒否される。 アクセストークンの有効期限は後述のリフレッシュトークンに比べ短い時間に設定される事が多い。
参考
雰囲気で OAuth2.0 を使っているエンジニアが OAuth2.0 を整理して、手を動かしながら学べる本