Skip to main content

認可エンドポイント(仕様)

このドキュメントでは、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 トークンが、それぞれ、 codeaccess_tokenid_tokenといったパラメーターキーで含まれます。例えば、レスポンス中に code=SplxlOBe とある場合、認可コードは SplxlOBe となります。 認可エンドポイントからの認可レスポンス中に含まれる可能性のあるパラメーターは下記のとおりです。 Table. Response Parameters From The Authorization Endpoint

2. レスポンスフォーマット

RFC 6749 に従うと、認可コードフローまたはインプリシットフローの場合、認可エンドポイントからの正常なレスポンスの HTTP ステータスは、“302 Found”であり、これにより、ユーザーエージェント(エンドユーザーがもちいている web ブラウザ)は別の場所へリダイレクトされます。OAuth 2.0 では、このリダイレクト先の場所を、リダイレクト URI と表現します。 リダイレクトURIの一部として、認可サーバーからのレスポンスパラメーターがクライアントアプリに手渡されます。例えば、
  1. 認可コードフロー
  2. リダイレクトURI が https://client.example.org/callback
  3. 認可コードの値が ap8uacb2
の場合、認可エンドポイントからクライアントアプリへのレスポンスは下記のようになります。
別の例を見てみましょう。例えば、
  1. インプリシットフロー
  2. アクセストークンの値が pqb8u3t
の場合、レスポンスは下記のとおりになります。
すでにお気付きかもしれませんが、認可コードフローの場合、パラメーターは query として渡され、インプリシットフローの場合は、 fragment として渡されます。この差は、RFC6749 の要求事項からくるものです。 Table. Relationship Between response_type And Response Parameter’s Location ただ、OpenID Connect、より具体的には、OAuth 2.0 Form Post Response Mode によって、さらに複雑になります。上記の仕様により、レスポンスフォーマットをコントロールする仕組みが導入され、“302 Found”に加え、 “200 OK”も利用可能となりました。“200 OK”は、認可リクエスト中に response_mode=form_post が含まれている場合に発生します。下記に仕様からの抜粋を示します。
上記の HTML 上では、リダイレクト URIは form タグの中の action として、レスポンスパラメーターは隠しパラメーターとして設定されています。各隠しパラメーターの名前が、state 及び id_token となっていることが確認できます。 ユーザーエージェントにて上記 HTML が読み込まれた後、onload で定義されている JavaScript が実行されます。結果、指定の リダイレクト URI へリダイレクトされます。 下記の表は、response_typeresponse_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 67494.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 ページを表示することで達成されます。
  1. エンドユーザーの認証をするための機能が提供されている
  2. クライアントアプリおよび要求されている権限(スコープ)を表示する
  3. エンドユーザーが上記要求を『認可する』または『拒否する』ためのボタンを提供している
下記に示したフォームは、認可エンドポイントが生成する認可画面の採用構成を示した例です。 editing token supported scopes OAuth は**認可(authorization)**のためのフレームワークであり、**認証(authentication)**のためのフレームワークではありません。RFC 6749, 3.1. Authorization Endpoint にて言及されているように、認可サーバーがリソースオーナーを認証する方法については OAuth のスコープ外です。クライアントクレデンシャルグラントを除き、アクセストークンをリソースオーナーに紐づけるためにも、エンドユーザーは認可エンドポイントにおいて認証される必要があります。 RFC 6749 にて言及されていないこともあり、エンドユーザーの認証方式については実装者が自由に設計できます。しかし、OpenID Connect において、エンドユーザーの認証をコントロールする機構が導入されています。下記に、それらについて説明します。

2. prompt リクエストパラメーター

任意のパラメーターである prompt リクエストパラメーターは、「認可サーバーがエンドユーザーに再認証と同意を求めるかどうか」を指定します(OpenID Connect Core 1.0, 3.1.2.1. Authentication Request)。 その値は、loginconsentselect_account および none の、スペース区切りの組み合わせになります。他の値を用いることはできません。各値は、それぞれ以下のような意味を持ちます。 loginconsentselect_account の3つの組み合わせを満足するためのもっとも単純な実装は、ログイン ID とパスワードを入力するフォームを表示することです。

3. 認証コンテキストクラスリファレンス

認証コンテキストクラスリファレンス(Authentication Context Class Reference、ACR) は、認証方式のコンテキスト、レベルおよびその他の属性を示す文字列です。例えば、urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransportAuthentication 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 リクエストパラメーターの値の例を示します。
認可リクエストがサブジェクトを指定している場合、エンドユーザーの認証はそのサブジェクトに対して行われなければなりません。この条件が満たされない場合、認可サーバーはエラーレスポンスを返す必要があります。詳細は、 OpenID Connect Core 1.0, 3.1.2.2. Authentication Request Validation をご参照ください。

6. login_hint リクエストパラメーター

クライアントアプリは、認可エンドポイントに対して、ログイン ID を特定するためのヒント(例えばメールアドレスなど)を、login_hint を使って付与できます。

7. id_token_hint Request Parameter

クライアントアプリは、過去に発行された ID トークンの値を id_token_hint というパラメーターの値として設定し、認可リクエストを送ることができます。ID トークンで示されているエンドユーザーと、すでに認証済みのエンドユーザーが同一ではない場合、認可サーバーはエラーレスポンスを返す必要があります。

8. ノーインタラクション

OpenID Connect では、認可エンドポイントにおいて、エンドユーザーとのインタラクションを伴わずに動作するための手段が導入されています。クライアントアプリは、認可リクエスト中に prompt=none というパラメーターを含めることができます。下記の条件がすべて満たされている場合のみ、prompt=none が含まれた認可リクエストは正しく処理されます。
  1. エンドユーザーがすでにログインしている。
  2. max_age または default_max_ageリクエストパラメーターによって、最大認証期間が指定されている場合、最後に認証してからの経過時間が最大認証期間を超えていない。
  3. claim リクエストパラメーターの値中の sub クレームによってサブジェクトが指定されている場合、エンドユーザ-のログイン ID がサブジェクトに一致している。
  4. claim リクエストパラメーターの値中のacr クレームが essential の場合、用いられる認証方式は、acr クレームによって指定されている方法のうちのどれかでなければならない。
  5. claims が要求されている場合、それらへの同意が事前に取られていなければならない(同意の取り方については、OpenID Connect のスコープ外)。