「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次  †
概要  †
ここでは、基本的に、OAuth 2.0について言及する。
OAuth 2.0は、認証ではなく認可のためのプロトコル(権限委譲プロトコル)。
変遷  †
OAuth 1.0  †
- OpenIDを使ってTwitterやMa.gnoliaのAPIの認証委譲する方法を議論を開始。
 
- 2007/10
OAuth Core 1.0 の最終草案がリリース。 
- 2008/11
第73回のIETF会合でOAuthの非公式会合も開かれ、
IETFにOAuthプロトコルを提案するかどうかを議論。 
- 2009/4/23
OAuth 1.0のセキュリティ問題が判明。
この問題は、OAuth 1.0aで修正された。 
OAuth 2.0  †
- OAuth 1.0とは後方互換性を持たない。
 
- 次世代のOAuthプロトコルとして、2012年にRFCとして発行された。
 
OAuth 1.0とOAuth 2.0の違い  †
概要  †
- HTTPSを必須にし、署名をなくし、トークン取得も簡略化
 
- Access Tokenのみでリソース取得が可能に
 
- Webアプリも含め、4つのClient Profileを仕様化
- Webサーバ(Web Server)
Webアプリケーション 
- User Agentベースアプリケーション
WWWブラウザ上のJavaScript 
- ネイティブアプリ(Native Application)
モバイルやデスクトップアプリ(ガイドライン程度しか定義されていない) 
- 自立クライアント(Autonomous)
既存の認証フレームワークとSAMLなどのプロトコルを使って連携する場合のフロー。 
 
参考  †
OAuth 2.0とOpenID Connectの違い  †
概要  †
- トークンがJWTアサーション形式で暗号化・署名される。
 
- 新しく、Hybrid Flowが追加されている。
- Authorization Codeグラント種別 ---> Authorization Code Flow
 
- Implicitグラント種別 ---> Implicit Flow
 
- 上記の組合せたようなグラント種別 ---> Hybrid Flow
 
 
参考  †
- OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
- OAuth 2.0 Authorization Code Flow
 
- OpenID Connect Authorization Code Flow
 
 
詳細  †
登場人物  †
Resource Owner  †
Client  †
- 実体例:
- Resource ServerにアクセスするClient。
 
- Program
- Webブラウザ
 
- スマホ ネイティブ
 
- Webアプリケーション
 
- , etc.
 
 
 
- やること:
- Authorization Serverの認可を受けてResources Serverのリソースにアクセスする。
 
- 認可レイヤの設置により、認証・認可の役割が分割されたため、
Resource Owner, Authorization Server, Resource Serverを繋ぐ
忙しいプログラムになった(だからOAuthはClient側でも難しい)。 
 
Authorization Server  †
- 実体例:認証・認可のサーバー機能(Webアプリケーション)
 
- やること:
- Authorization Server用の認証チケットの発行を行う。
 
- Resource Server用のAccess Tokenの発行を行う。
 
 
Resource Server  †
- 実体例:
- リソースアクセスを提供するサーバー機能(WebAPIなど)
 
- Authorization Serverと別でも良い
 
 
プロトコル・フロー  †
+--------+                               +---------------+
|        |--(A)- Authorization Request ->|   Resource    |
|        |                               |     Owner     |
|        |<-(B)-- Authorization Grant ---|               |
|        |                               +---------------+
|        |
|        |                               +---------------+
|        |--(C)-- Authorization Grant -->| Authorization |
| Client |                               |     Server    |
|        |<-(D)----- Access Token -------|               |
|        |                               +---------------+
|        |
|        |                               +---------------+
|        |--(E)----- Access Token ------>|    Resource   |
|        |                               |     Server    |
|        |<-(F)--- Protected Resource ---|               |
+--------+                               +---------------+
(A) Authorization Request  †
Resource Ownerは、Clientを経由して、Authorization Server(の認証画面)で認証する。
(B) Authorization Grant  †
認証後、Clientは、Authorization Serverの認可エンドポイントで認可グラントを受け取る。
(C) Authorization Grant  †
Clientは、Authorization ServerのTokenエンドポイントに認可グラントを提示することで、Access Tokenを要求する.
(D) Access Token  †
Authorization Serverは、Clientと 認可グラントが正当であれば、ClientにAccess Tokenを発行する。
(E) Access Token, (F) Protected Resource  †
Clientは、Resource ServerにAccess Tokenを提示してProtected Resourceにアクセスする。
★ 参考  †
ココのスライドが参考になる。
グラント種別毎のフロー  †
以下、4つのグラント種別に対応するフローがある。
Authorization Codeグラント種別  †
- 特徴
- Authorization ServerはClientを認証する。
 
 
Implicitグラント種別  †
- 特徴
- Authorization ServerはClientを認証しない。
 
 
Resource Owner Password Credentialsグラント種別  †
- 概要
- ベース クライアント セキュリティ モデルみたいなもんだが、
以下のようにあるため、本グラント種別の利用は、特殊なケースに留める。
「この認可タイプを使用可能にするときには特に注意を払い、
他のフローが実行可能でない場合にのみ許可する必要があります。」
 
 
- 特徴
- Resource OwnerのCredentialsをClientに送ってしまう。
 
- 従って、Confidential Clientから使用する。
- Resource OwnerとClientの間に高い信頼関係があること。
 
- Authorization Serverは、Clientを認証すること。
 
 
- 以下のような、特殊なケースに留める。
 
 
Client Credentialsグラント種別  †
- 特徴
- Clientと Authorization Server間で調整済みの、
Clientの保有するリソースにアクセスする場合に使用する。 
- 従って、Confidential Clientから使用する。
- Authorization Serverは、Clientを認証すること。
 
 
 
Clientについて  †
種類  †
- Public
Client Credentialsの機密性を維持不可能なClient
- WWWブラウザ
 
- ネイティブ・アプリケーション
 
- Resource Ownerのデバイスにインストールされたアプリケーション
 
 
- Client Profile(クライアント属性)による分類
- Confidential
 
- Public
- ネイティブ・アプリケーション
 
- User Agentベースアプリケーション(WWWブラウザ上のJavaScript)
 
 
 
事前登録  †
認可用のCredentials(Token)  †
Access Token  †
RFCを読むと、
- 保護されたリソースにアクセスするために使用されるCredential。
 
- Authorization ServerによってClientに対して発行されるランダムな文字列。
 
- アクセス範囲とアクセス期間を表す。
 
- 発行はResource Ownerによって許可される。
 
- Authorization ServerのTokenエンドポイントが発行し、
 
- Resource Serverへの要求に対して、以下の様な形式で送信される。
 
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer XXXXXXXXXX
Refresh Token  †
RFCを読むと、
Accessトークンのタイプ  †
- Bearer Token
- 署名無しトークン(Access Tokenは基本的にBearer Token)
 
- トークンが誰に対して発行されたのかを確認せずに、
「トークンを持っていること」をベースに API 利用を許可する。 
- ∴ 利用する際、暗号鍵の所持を証明するよう要求されない。
 
 
- MAC Token
- アクセストークンと共にMessage Authentication Code (MAC)キーを発行する。
 
- MACキーはHTTPリクエストの一部分を署名するのに利用される。
 
 
認証用のCredentials  †
Resource Owner  †
Resource Ownerの認証用のCredentialsはOAuth 2.0 仕様の外
(Authorization ServerはユーザID、パスワードなどを使用してResource Ownerを認証)
Client  †
Clientの認証用のCredentials
(Authorization ServerはこれによりClientを認証)
- クライアント識別子
クライアント識別子(2つのセット)の情報は、URIで送信しない。
- client_id(1つだけの場合、URIに露見する)
 
- client_secret(URIに露見しない、させない)
 
 
- 認証方法
- ベーシック認証などのパスワードベースのHTTP認証スキーム
 
- HTTP認証スキームを使用できない場合にPOSTを使用する(非推奨)。
 
 
エンドポイントの種類  †
URLは仕様で規定されない。
Authorization Server上のエンドポイント  †
- 認可エンドポイント
- 概要
- Resource Ownerを認可するエンドポイント
 
- 認証画面ではないので注意(認証結果を見て認可する)。
 
- 仲介コードや、Access Tokenを発行するエンドポイント。
 
 
- 特徴
- HTTPSのGETを使用する。
 
- Authorization Codeや、Implicitグラント種別で使用する。
 
 
 
Client上のエンドポイント  †
Redirectエンドポイント
- 特徴
- HTTPSのGETを使用する。
 
- Authorization Codeや、Implicitグラント種別で使用する。
 
 
- 注意点
- Authorization Codeでは、なるべくエンドポイント・コンテンツにトークンが露見しないようにする。
 
- Implicitグラントなど、トークンがコンテンツに露見してしまう場合、以下に従い拡散を防止する。
- コンテンツには、3rd partyのscriptを含めるべきでない。
 
- Client自身のscriptが初回に実行されるようにすること。
 
- URIからトークンを抽出し、露見しないように他へPOSTしBodyに含めるなどする。
 
 
 
Requestパラメタ  †
response_typeパラメタ  †
認可エンドポイントにGETで送付する。
以下のように、グラント種別毎に、決まったパラメタを指定する必要がある。
| 項番 | グラント種別 | パラメタ値 | 意味 | 
| 1 | Authorization Code | code | 仲介コードを要求 | 
| 2 | Implicit | token | Access Tokenを要求 | 
 
client_id, client_secretパラメタ  †
Clientの識別や認証のために、色々な所で使用されるパラメタ。
redirect_uriパラメタ  †
client_idに対応するRedirectエンドポイントを指定するために指定するパラメタ。
grant_typeパラメタ  †
TokenエンドポイントにPOSTを送付するときに指定するパラメタ。
以下のように、グラント種別毎に、決まったパラメタを指定する必要がある。
| 項番 | グラント種別 | パラメタ値 | 
| 1 | Authorization Code | authorization_code | 
| 2 | Resource Owner Password Credentials | password | 
| 3 | Client Credentials | client_credentials | 
| 4 | 上記1、2、3のグラント種別でRefreshトークンを使用する際 | refresh_token | 
 
scopeパラメタ  †
- Authorization Codeグラント種別
- 認可エンドポイントにGETで送付する。
 
- 送信前に、画面で認可scopeをResource Ownerに提示する。
 
 
- Resource Owner Password Credentialsグラント種別
 
stateパラメタ  †
CSRFのセキュリティ対策に使用が推奨されるパラメタ。
- 概要
- 認可エンドポイントにGETを送付するときに指定する。
 
- Redirectエンドポイントを使用する、Authorization Code, Implicitグラント種別で使用する。
 
- 以降のやり取りでも引き継がれて使用される(値は変更しないこと)。
 
 
- 要件
- 推測困難な文字列である必要がある。(ワンタイム性は必須ではない)
 
 
Responseパラメタ  †
code, access_token, refresh_token
| 項番 | パラメタ値 | 意味 | 
| 1 | code | access_tokenを取得するためのtokenで、Authorization Codeグラント種別でのみ使用する。 | 
| 2 | access_token | コチラを参照 | 
| 3 | refresh_token | コチラを参照 | 
 
参考  †
OAuth 1.0  †
OAuth 2.0  †
@IT  †
- OAuth 2.0でWebサービスの利用方法はどう変わるか
 
Qiita  †
slideshare  †
Tags: :認証基盤, :クレームベース認証, :OAuth