第 4 章 クラウドサービス事業者向け実装ガイド
4.1. OpenID Connect RP (クライアント)の実装
4.1.4. 利用企業の認証サーバーからの認証結果の受け取り
利用企業の認証サーバーでの認証結果は、認証要求の際に指定した redirect_uri にフラグメン トとして付加されたURIへリダイレクトされることでクラウドサービスへ渡される。
利用企業の認証サーバーからブラウザへ返される応答の例を以下に示す。
HTTP/1.1 302 Found
Location: https://www.svc.example.net/cb#
id_token=eyJhbGciOi ... .eyJpc3MiOi ... .rZR3EjzaHA ...
&state=k4y97klszxi
この結果、クラウドサービスは次のリクエストを受け取る。
GET /cb HTTP/1.1
Host: www.svc.example.net
フラグメントに付与された ID トークンを受け取るためには、フラグメントの値を HTTP
POSTするJavaScriptを実行する必要がある。そのため、GETによるredirect_uriへのアクセ
スではJavaScriptを応答する。
JavaScript の実装については標準としての取り決めはないため、クラウドサービスが自サー
ビスに適した方式で実装すればよい。OpenID Connect Core では実装方法の例として以下の コードが紹介されている。(OpenID Connect Core 1.0 [OpenID.Core] のSection 15.5.3)
この例では、"https://www.svc.example.net/catch_response" へ POSTし、POSTが成功すれ ば、"https://www.svc.example.net/redirect_after_login" へリダイレクトするようになっている。
HTTP/1.1 200 OK
Content-Type: text/html
<script type="text/javascript">
// First, parse the query string
var params = {}, postBody = location.hash.substring(1), regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(postBody)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
// And send the token over to the server var req = new XMLHttpRequest();
// using POST so query isn't logged
req.open('POST', 'https://' + window.location.host + '/catch_response', true);
req.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
req.onreadystatechange = function (e) { if (req.readyState == 4) {
if (req.status == 200) {
// If the response from the POST is 200 OK, perform a redirect window.location = 'https://'
+ window.location.host + '/redirect_after_login' }
// if the OAuth response is invalid, generate an error message else if (req.status == 400) {
alert('There was an error processing the token') } else {
alert('Something other than 200 was returned') }
} };
req.send(postBody);
4.1.4.1. 認証成功時の応答
認証に成功した場合、フラグメントで2つのパラメータを受け取る。
No パラメータ 例 説明
1 id_token eyJhbGciOi ... .eyJpc3MiOi ... .rZR3EjzaHA ... 発行されたIDトークン
2 state k4y97klszxi 認証要求時に指定された state
値
[4.1.4節] で例示したJavaScriptを使用した場合は、以下のようなリクエストとして認証結果
を受け取ることになる。
POST /catch_response HTTP/1.1 Host: www.svc.example.net
Content-Type: application/x-www-form-urlencoded
id_token=eyJhbGciOi ... .eyJpc3MiOi ... .rZR3EjzaHA ...&state=k4y97klszxi
認証結果を受け取ると、最初に state 値が認証要求時に指定した値と同一であるかどうかを検 証する。
state 値が一致しない場合は認証エラーとし、ユーザーを適切なページへ誘導する必要がある。
適切なページとは、エラーメッセージを表示するページのことを指す。
state値が一致した場合は、IDトークンの検証へ進む。
4.1.4.2. 認証失敗時の応答
認証に失敗した場合、フラグメントで2つのパラメータを受け取る。
No パラメータ 例 説明
1 error access_denied エラーコード(OAuth 2.0 [RFC6749] の Section
4.1.2.1, OpenID Connect Core 1.0 [OpenID.Core] の
Section 18.3.1のコードを取りうる)
2 error_description User
authentication failed.
エラーの詳細(このパラメータはオプションであ る)
3 state k4y97klszxi 認証要求時に指定されたstate値
[4.1.4節] で例示したJavaScriptを使用した場合は、以下のようなリクエストとして認証結果
を受け取ることになる。
POST /catch_response HTTP/1.1 Host: www.svc.example.net
Content-Type: application/x-www-form-urlencoded
error=access_denied&error_description=User%20authentication%20failed.&state=k4y97kl szxi
認証結果を受け取ると、最初に state 値が認証要求時に指定した値と同一であるかどうかを検 証する。
state 値が一致しない場合は、受け取ったレスポンス(エラーコードとエラーの詳細)は信頼
することができない。
認証失敗の応答を受け取った場合は、state 値の検証結果にかかわらず認証エラーとし、ユー ザーを適切なページへ誘導する必要がある。適切なページとは、エラーメッセージを表示する ページのことを指す。