IdP起点SAMLサインオンをOIDCアプリに構成する
Auth0はアプリケーションのために、IDプロバイダー(IdP)起点のSAML応答をOpenID Connect(OIDC)応答に変換する方法を提供しています。
OIDプロトコルはIdP起点の認証フローに対応しませんが、この方法ではフォームPOSTを使用した暗黙フローを使ってIdP起点の認証フローを模倣することができます。
これを実装するには、以下を行う必要があります。
カスタムログイン経路ハンドラーをアプリケーションに追加します。
以下を許可するようにSAML接続を更新します。
IdP起点のSAML応答の受信を受け付ける
サービスプロバイダー起点の認証要求を送信するデフォルトのアプリケーションにリダイレクトする
仕組み

ユーザーがSAML IdPのログインエンドポイントに移動します。
SAML IdPがログインページを返します。
ユーザーが資格情報をSAML IdPに送信します。
SAML IdPがユーザーのセッションを作成し、フォームPostとSAML応答のあるHTMLページを返します。
ページがHTTP
POST
呼び出しを行って、自動的にSAML応答をAuth0テナントに送信します。Auth0テナントがユーザーのブラウザーでOIDCアプリケーションのカスタムログイン経路ハンドラーにリダイレクトし、DトークンをURLフラグメントとして渡します。
ブラウザーがOIDCアプリケーションのカスタムログイン経路ハンドラーを呼び出して、
connection
パラメーターとIDトークンを渡します。OIDCアプリケーションがIDトークンを無視して
connection
パラメーターを解析し、セッションのstate
パラメーターを作成してから、ユーザーのブラウザーをAuth0テナントの/authorize
エンドポイントにリダイレクトします。ブラウザーがAuth0テナントの
/authorize
エンドポイントを呼び出して、提供されたconnection
とstate
のパラメーターを渡します。Auth0テナントがSAMLログイン要求を生成し、ユーザーのブラウザーをSAML IdPのログインエンドポイントにリダイレクトします。
ブラウザーがSAMLログイン要求をSAML IdPのログインエンドポイントに送信します。
SAML IdPがユーザーのセッションを見つけて、フォームPostとSAML応答のあるHTMLページを返します。
ページがHTTP
POST
呼び出しを行って、自動的にSAML応答をAuth0テナントに送信します。Auth0テナントがユーザーのブラウザーをアプリケーションのログイン経路ハンドラーにリダイレクトします。
ブラウザーばアプリケーションのログイン経路ハンドラーを呼び出して、提供された
state
パラメーターとIDトークンを渡します。OIDCアプリケーションが
state
パラメーターを検証して、IDトークンを解析し、ユーザーにアプリケーションセッションを作成します。
カスタムログイン経路ハンドラーを作成する
カスタムログイン経路ハンドラーはアプリケーションのログインメソッドを呼び出します。ハンドラーはconnection
パラメーターを受け付けて、Auth0テナントに送信する認証要求に含めます。
カスタムログイン経路ハンドラーに関係付けるエンドポイントは、標準のログイン経路ハンドラーに関係付けているものとは別にすることをお勧めします。たとえば、標準のログイン経路ハンドラーを/login
エンドポイントと関連付けている場合には、カスタムログイン経路ハンドラーを/startlogin
エンドポイントと関連付けます。
例
Auth0 Single Page App SDKを使用している場合には、カスタムログイン経路ハンドラーを追加して、ログインメソッドを更新し、以下のように接続パラメーターに対応させることができます。
const router = {
"/": () => showContent("content-home"),
"/profile": () =>
requireAuth(() => showContent("content-profile"), "/profile"),
"/login": () => login(),
"/startlogin": () => startlogin()
};
//new method to start login from idp-initiated callback
const startlogin = async () => {
console.log(window.location.href)
let myURL = new URL(window.location.href);
let conn = myURL.searchParams.get("connection");
return login(null, conn);
}
/**
* Starts the authentication flow
*/
const login = async (targetUrl, connection) => {
try {
console.log("Logging in", targetUrl);
const options = {
redirect_uri: window.location.origin,
};
if (connection) {
options.connection = connection;
}
if (targetUrl) {
options.appState = { targetUrl };
}
await auth0.loginWithRedirect(options);
} catch (err) {
console.log("Log in failed", err);
}
};
Was this helpful?
クエリ文字列を作成する
クエリ文字列にはredirect_uri
パラメーターを含めます。パラメーターの値はURLエンコードされ、以下で構成されなければなりません。
カスタムログイン経路ハンドラーに関連付けられているアプリケーションのエンドポイント
SAML接続名の値が指定された
connection
パラメーター
例
アプリケーションのエンドポイントがhttps://exampleco.com/startlogin
でSAML接続名がmy-saml-connection
の場合、クエリ文字列はredirect_uri=https%3A%2F%2Fexampleco.com%2Fstartlogin%3Fconnection%3Dmy-saml-connection
になります。
アプリケーションを構成する
[Auth0 Dashboard]>[Applications(アプリケーション)]>[Application(アプリケーション)]に移動します。
Auth0にあるOIDCアプリケーションを表す新しいアプリケーションを作成します。
[Allowed Callback URL(許可されているコールバックURL)]に、カスタムログイン経路ハンドラーに関連付けられているアプリケーションのエンドポイントを含めて更新します。
接続を構成する
[Auth0Dashboard]>[Authentication(認証)]>[Enterprise(エンタープライズ)]>[SAML]に移動します。
新しいSAML接続を作成します。
[IdP-Initiated SSO(IdP起点のSSO)]ビューに切り替えます。
[Accept Requests(要求を許可する)]を選択します。
[Default Application(デフォルトのアプリケーション)]に、先ほど作成したアプリケーションを選択します。
[Response Protocol(応答プロトコル)]に[OpenID Connect]を選択します。
[Query String(クエリ文字列)]に、先ほど作成したクエリ文字列を入力します。