• 検索結果がありません。

利用企業の認証サーバーからの認証結果の受け取り

第 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 値の検証結果にかかわらず認証エラーとし、ユー ザーを適切なページへ誘導する必要がある。適切なページとは、エラーメッセージを表示する ページのことを指す。