Skip to main content
Resource App向けのCross App Access (XAA) は早期アクセスです。Enterprise、B2B Pro、B2B Essentialをご利用のお客様は、Enterprise Connectionsの機能として利用できます。Freeテナントでも、試用期間中にお試しいただけます。この機能を利用すると、OktaのMaster Subscription Agreementに記載されている該当のFree Trial条項に同意したものとみなされます。
XAAフローをテストするには、Requesting AppがエンタープライズIdPからIdentity Assertion Authorization Grant (ID-JAG) を取得し、Auth0でアクセストークンと交換する必要があります。この記事では、ID-JAGを取得する方法 (SAMLまたはOIDC経由) と、それをAuth0の/tokenエンドポイントに送信してAPI用のアクセストークンを取得する方法を説明します。

ID-JAG を取得する

ID-JAG の取得方法は、Requesting App がエンタープライズ IdP に対して SAML と OIDC のどちらを使用して認証するかによって、2 つに分かれます。

SAML Requesting App

まず、IdP テナントを使って Requesting App にログインします。ログインに成功すると、IdP によってブラウザーは SAML レスポンス とともに Requesting App にリダイレクトされます。次に、Requesting App は SAML レスポンス に含まれる SAML アサーション を安全に OIDC refresh_token と交換し、その後 refresh_token を ID-JAG と交換します。
SAML レスポンス => SAML Assertion => refresh_token => ID-JAG
IdP から SAML レスポンス を受け取ったら、SAML library を使用して SAML アサーション を抽出します。以下に SAML レスポンス の例を示します。
xmllint コマンドラインツールを使用して、SAML アサーション を抽出できます。
SAML アサーション を OIDC リフレッシュトークンと交換するため、Requesting App は以下のパラメータを指定して、IdP の /token エンドポイントにトークン交換リクエストを送信します。
IdP クライアントが confidential の場合、client_secret または client_assertion のいずれかが Form Post または HTTP ヘッダーで送信されます。そのため、両者は同時に使用できず、任意としてマークされています。 呼び出しが成功すると、JSON レスポンスの access_token プロパティに refresh_token が返されます。
refresh_token を ID-JAG と交換するには、以下のパラメータを指定して、IdP の /token エンドポイントに対して別のトークン交換リクエストを行います。
IdP クライアントが confidential の場合、client_secret または client_assertion のいずれかが Form Post または HTTP ヘッダーで送信されます。そのため、両者は同時に使用できず、任意としてマークされています。 この呼び出しのレスポンスには、access_token プロパティ内に ID-JAG が含まれます。
ID-JAG は、次のような JWT 形式です。
Resource App が SAML アプリケーションの場合、ID-JAG には標準の sub クレームに加え、認証済みユーザーの SAML NameID の詳細 (formatissuernameidnameid_format) を含む sub_id クレームも含まれます。

OIDC Requesting App

まず、IdP テナントを使用して Requesting App にログインします。ログインに成功すると、IdP は認可コードとともにブラウザを Requesting App にリダイレクトします。次に、Requesting App は認可コードを安全に アクセストークン と ID トークンに交換します。
ID トークン => ID-JAG
ID トークンを ID-JAG に交換するため、Requesting App は次のパラメータを指定して、IdP の /token エンドポイントにトークン交換リクエストを送信します。
IdP クライアントが confidential の場合、client_secret または client_assertion のいずれかを Form Post または HTTP ヘッダーで送信します。そのため、これらは相互排他的であり、任意としてマークされています。

ID-JAG を Auth0 の /token エンドポイントに送信する

Requesting App は ID-JAG を取得した後、アクセストークンリクエストを Auth0 テナントの /token エンドポイントに送信します。
Requesting App が confidential client の場合、client_secret または client_assertion のいずれかが form post または HTTP ヘッダーで送信されます。そのため、両者は相互排他的であり、任意としてマークされています。 Auth0 認可サーバーは、ユーザーのアイデンティティを確認するために ID-JAG を検証した後、Auth0 テナント内の API 用のアクセストークンを発行します。アクセストークンには、Auth0 テナントで設定されたロールベースのアクセス制御やその他のポリシーで許可された、request した スコープ も含まれます。 Auth0 認可サーバーは、ID-JAG token exchange への応答としてリフレッシュトークンを発行しません。そのため、Requesting App が XAA を介して新しいアクセストークンを取得するには、enterprise IdP から新しい ID-JAG を取得し、該当するアクセス制御を受ける必要があります。

詳しくはこちら

XAAフローをテストするには、以下のリソースをご利用ください。
  • Auth0 Cross App Access Inspector: OktaとAuth0間のXAAフローをテストするためのシンプルなNode.jsアプリケーションです。
  • XAA.dev: ブラウザーでCross App Accessをテストできるオンラインsandboxです。