認可エンドポイント(仕様)
このドキュメントでは、RFC6749 と OpenID Connect の違いに着目しつつ、認可エンドポイント(authorization endpoint) について説明します。RFC 6749 等の仕様に詳しい場合は、読み飛ばしていただいて構いません。1. パス
認可エンドポイントのパス(Path)について、RFC 6749 で指定されていることは、「エンドポイント URI はフラグメントを含んではならない(The endpoint URI MUST NOT include a fragment component)」ということだけです。上記さえ守られている限り、如何なる名前も使えます。例えば、/auth/authorization(完全なURLとして書くと、https://example.com/auth/authorization)は、認可エンドポイントの URI として適切です。
2. セキュリティ
RFC 6749 では、認可エンドポイントにおいて TLS(Transport Layer Security)を使うことが要求されています。3. HTTP メソッド
RFC 6749, 3.1. Authorization Endpoint に従うと、認可エンドポイントは、GETをサポートすることは必須ですが、POSTのサポートに関しては任意です。しかし、OpenID Connect Core 1.0, 3.1.2.1. Authentication Request では、認可エンドポイントは、POSTをサポートすることが要求されています。また、POSTを使う場合、パラメーターを application/x-www-form-urlencoded の形でフォーマットすることが必須です。
Table. HTTP Methods Of The Authorization Endpoint
4. リクエストパラメーター
RFC 6749 では、1.3. Authorization Grant において4つの grant type が定義されています。grant type とは、認可サーバーがアクセストークンを発行するフローの種類です。4つのうち、Authorization Code Grant(認可コードフロー、とも言う)と Implicit Grant(インプリシットフロー、とも言う)の2つに関しては、認可エンドポイントを利用します。両フローとも、認可エンドポイントで受け取るリクエストパラメーター名は同じです。 Table. RFC 6749 にて定義されている認可エンドポイントへのリクエストパラメーター
OpenID Connect では、さらにパラメーターが追加されています。その多くは、OpenID Connect Core 1.0, 3.1.2.1. Authentication Request に記載されています。次に示す表は、RFC 6749、OpenID Connect およびその他の関連仕様で定義さているリクエストパラメーターを一覧にしたものです。
Table. OAuth/OpenID Connect で定義されている認可エンドポイントへのリクエストパラメーター
認可レスポンス
1. レスポンスパラメーター
RFC 6749 に従うと、認可リクエストが成功した場合、認可エンドポイントは、認可コード(authorization code または アクセストークン(access token) を発行することになります。 上記に加え、OpenID Connect ではさらにオブジェクトが追加され、ID トークン(ID token) を発行することが可能となりました。OpenID Connect は OAuth 2.0 を拡張する形で作られた仕様であり、主な目的は、エンドユーザーが認証されたという情報を ID トークンの形で利用できるようにすることです。 認可エンドポイントから返されるオブジェクトをまとめると下記のようになります。 Table. 認可エンドポイントから返されるオブジェクト一覧
OpenID Connect が定義される以前は、認可エンドポイントが返却するオブジェクトは、認可コードまたはアクセストークンのいずれかでした。OpenID Connect 以降、上記の3つすべてを返す場合もあり、それは認可リクエスト中の
response_type パラメーターの値で決まります。response_type と認可エンドポイントで返されるオブジェクトの関係を以下に示します。
Table. response_type と認可エンドポイントで返されるオブジェクトの関係
認可エンドポイントからのレスポンスの中には、認可コード、アクセストークンおよび ID トークンが、それぞれ、
code、access_token、id_tokenといったパラメーターキーで含まれます。例えば、レスポンス中に code=SplxlOBe とある場合、認可コードは SplxlOBe となります。
認可エンドポイントからの認可レスポンス中に含まれる可能性のあるパラメーターは下記のとおりです。
Table. Response Parameters From The Authorization Endpoint
2. レスポンスフォーマット
RFC 6749 に従うと、認可コードフローまたはインプリシットフローの場合、認可エンドポイントからの正常なレスポンスの HTTP ステータスは、“302 Found”であり、これにより、ユーザーエージェント(エンドユーザーがもちいている web ブラウザ)は別の場所へリダイレクトされます。OAuth 2.0 では、このリダイレクト先の場所を、リダイレクト URI と表現します。 リダイレクトURIの一部として、認可サーバーからのレスポンスパラメーターがクライアントアプリに手渡されます。例えば、- 認可コードフロー
- リダイレクトURI が
https://client.example.org/callback - 認可コードの値が
ap8uacb2
- インプリシットフロー
- アクセストークンの値が
pqb8u3t
ただ、OpenID Connect、より具体的には、OAuth 2.0 Form Post Response Mode によって、さらに複雑になります。上記の仕様により、レスポンスフォーマットをコントロールする仕組みが導入され、“302 Found”に加え、 “200 OK”も利用可能となりました。“200 OK”は、認可リクエスト中に
response_mode=form_post が含まれている場合に発生します。下記に仕様からの抜粋を示します。
form タグの中の action として、レスポンスパラメーターは隠しパラメーターとして設定されています。各隠しパラメーターの名前が、state 及び id_token となっていることが確認できます。
ユーザーエージェントにて上記 HTML が読み込まれた後、onload で定義されている JavaScript が実行されます。結果、指定の リダイレクト URI へリダイレクトされます。
下記の表は、response_type と response_mode の組み合わせに対する、HTTPステータスとレスポンスパラメーターが含まれている場所を示しています。
Table. Relationship Between response_type/response_mode Combinations And HTTP Status/Response Parameters’ Location
3. エラーレスポンス
認可リクエストを処理している間にエラーが発生した場合、サービスはクライアントアプリにエラーレスポンスを返します。エラーが発生する時点で、エラーを報告すべきリダイレクト URI が確定している場合、エラーはリダイレクト URI に送付されます。その際、レスポンス中に必ずerror レスポンスパラメーターが含まれます。上記に加え、error_description 及び error_uri が含まれる場合もあります。例えば、下記のようなレスポンスがクライアントアプリに返されます。
error レスポンスパラメーターが取りうる値は、RFC 6749 の 4.1.2.1. Error Response (認可コードフロー) および 4.2.2.1. Error Response (インプリシットフロー) にて定義されています。また、OpenID Connect Core 1.0 に関しては、3.1.2.6. Authentication Error Response にて定義されています。
下記に、エラーコードの一覧を示します。
Table. Values of error from the Authorization Endpoint
4. リダイレクト URI が利用できない時
リダイレクト URI が特定される前にエラーが発生する可能性があります。例えば、提示されたクライアント ID が無効で、指定されたリダイレクト URI が登録済みかどうか確かめることができないとき、3. エラーレスポンスに示した方法でエラーを伝えることはできません。 RFC 6749, 3.1.2.4. Invalid Endpoint では、下記のように言及されています。If an authorization request fails validation due to a missing, invalid, or mismatching redirection URI, the authorization server SHOULD inform the resource owner of the error and MUST NOT automatically redirect the user-agent to the invalid redirection URI.しかしながら、リソースオーナー(エンドユーザー)にエラーを通知する方法は明記されていません。考えられる方法としては、以下の選択肢が考えられます。
OpenID Connect において追加されたユースケース、具体的には、ユーザーとの連携がなされない
prompt=none の場合を想定すると、application/json の方が良い選択肢かと思います。
認可インタラクション
1. 認可エンドポイントの目的
認可エンドポイントの主たるタスクは、クライアントアプリに対して、エンドユーザーの認可を与えることです。通常、このプロセスは下記の特徴を持つ HTML ページを表示することで達成されます。- エンドユーザーの認証をするための機能が提供されている
- クライアントアプリおよび要求されている権限(スコープ)を表示する
- エンドユーザーが上記要求を『認可する』または『拒否する』ためのボタンを提供している

2. prompt リクエストパラメーター
任意のパラメーターである prompt リクエストパラメーターは、「認可サーバーがエンドユーザーに再認証と同意を求めるかどうか」を指定します(OpenID Connect Core 1.0, 3.1.2.1. Authentication Request)。
その値は、login、consent、select_account および none の、スペース区切りの組み合わせになります。他の値を用いることはできません。各値は、それぞれ以下のような意味を持ちます。
login、consent、select_account の3つの組み合わせを満足するためのもっとも単純な実装は、ログイン ID とパスワードを入力するフォームを表示することです。
3. 認証コンテキストクラスリファレンス
認証コンテキストクラスリファレンス(Authentication Context Class Reference、ACR) は、認証方式のコンテキスト、レベルおよびその他の属性を示す文字列です。例えば、urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport(Authentication Context for the OASIS Security Assertion Markup Language (SAML) V2.0. からの抜粋)は、保護されたセッション内でパスワードを提示する認証方式を意味します。
OpenID Connect Core 1.0 では、「0」以外の具体的な ACR の値について言及がありません。ただ、ACR の値を用いるパーティー(例えば認可サーバーやクライアントアプリ)は**『用いられている値の意味に同意する必要がある』** とだけ述べられています(OpenID Connect Core 1.0, 2. ID Token, acr)。
3.1 acr_values リクエストパラメーター
acr_values リクエストパラメーター (OpenID Connect Core 1.0, 3.1.2.1. Authentication Request, acr_values) は、ACR のリストを指定するためのパラメーターです。認可リクエスト中にこのパラメーターがある場合、認可エンドポイントの実装は、エンドユーザーの認証に関して、指定されたリストの中の一つを満足する必要があります。
3.2 claims リクエストパラメーター中の acr クレーム
ACR のリストを指定する方法は他にもあります。claim リクエストパラメーターの値の中に acr クレームを含むことによっても指定でします。下記の JSON は、claim リクエストパラメーターの値の例です (OpenID Connect Core 1.0, 5.5. Requesting Claims using the “claims” Request Parameter からの抜粋です)。
claim リクエストパラメーターによって指定される場合、ACR の要求は、“essential” のみとなります。
acr クレームが必須の場合、値に指定されている ACR のリストのうちのどれかを満たす必要があります。もし、どれも対応できない場合、認可エンドポイントは、クライアントアプリにエラーメッセージを返す必要があります。詳細は、 OpenID Connect Core 1.0, 5.5.1.1. Requesting the “acr” Claim をご参照ください。
3.3 ID トークン中の acr クレーム
ID トークンは、acr クレームを含むことができます。詳細は、 “OpenID Connect Core 1.0, 2. ID Token, acr” をご参照ください。
3.4 サポートする ACR
“OpenID Connect Discovery 1.0, 3. OpenID Provider Metadata” では、OpenID Provider の属性をリストにしています。その中にある、acr_values_supported メタデータは、OpenID Provider によってサポートされている ACRのリストを指定します。
Authleteでは、サービスの supportedAcrs がこれに該当します。
3.5 デフォルト ACR
“OpenID Connect Dynamic Client Registration 1.0, 2. Client Metadata” はクライアントアプリの属性をリスト化しています。その中にある、acr_values_supported メタデータは、ACR 値を明示しないクライアントアプリからの認可リクエストが来た際に、使われるべきデフォルトの ACR 値を指定しています。
Authlete では、クライアントの defaultAcrs がこれに該当します。
4 最大認証期間
最大認証期間 (Maximum Authentication Age) は、「最大で許容される、最後にエンドユーザーが認証されてからの経過時間」を秒で示したものです (OpenID Connect Core 1.0, 3.1.2.1. Authentication Request, max_age)。もし、経過時間が最大認証期間より長い場合、エンドユーザーはログインしていたとしても、再度認証が必要となります。4.1 max_age リクエストパラメーター
認可リクエストの中に、max_age というリクエストパラメーターを含めることで、最大認証期間を指定することができます。
4.2 デフォルト最大認証期間
“OpenID Connect Dynamic Client Registration 1.0, 2. Client Metadata” にて示されているdefault_max_age という属性値は、クライアントアプリからの認可リクエスト中に max_age が指定されていない場合に使われます。
Authlete では、クライアントの defaultMaxAge がこれに該当します。
5. sub クレーム
クライアントアプリは、sub クレームを使い、認可されたいサブジェクトを認可リクエストで指定することができます。以下に、sub クレームとその値を含む claims リクエストパラメーターの値の例を示します。
6. login_hint リクエストパラメーター
クライアントアプリは、認可エンドポイントに対して、ログイン ID を特定するためのヒント(例えばメールアドレスなど)を、login_hint を使って付与できます。
7. id_token_hint Request Parameter
クライアントアプリは、過去に発行された ID トークンの値を id_token_hint というパラメーターの値として設定し、認可リクエストを送ることができます。ID トークンで示されているエンドユーザーと、すでに認証済みのエンドユーザーが同一ではない場合、認可サーバーはエラーレスポンスを返す必要があります。
8. ノーインタラクション
OpenID Connect では、認可エンドポイントにおいて、エンドユーザーとのインタラクションを伴わずに動作するための手段が導入されています。クライアントアプリは、認可リクエスト中にprompt=none というパラメーターを含めることができます。下記の条件がすべて満たされている場合のみ、prompt=none が含まれた認可リクエストは正しく処理されます。
- エンドユーザーがすでにログインしている。
max_ageまたはdefault_max_ageリクエストパラメーターによって、最大認証期間が指定されている場合、最後に認証してからの経過時間が最大認証期間を超えていない。claimリクエストパラメーターの値中のsubクレームによってサブジェクトが指定されている場合、エンドユーザ-のログイン ID がサブジェクトに一致している。claimリクエストパラメーターの値中のacrクレームがessentialの場合、用いられる認証方式は、acrクレームによって指定されている方法のうちのどれかでなければならない。claimsが要求されている場合、それらへの同意が事前に取られていなければならない(同意の取り方については、OpenID Connect のスコープ外)。