OICのJWTユーザアサーションを使用したOauthの脱神秘化 (2022/09/30)
OICのJWTユーザアサーションを使用したOauthの脱神秘化 (2022/09/30)
https://blogs.oracle.com/integration/post/oic-oauth-using-jwt-user-assertion
投稿者:Vernon Saldanha | Principal Product Manager
OICは、認証コード、クライアント認証情報、JWTユーザアサーションなど、Oauthベースの認証方法のいくつかの異なる方法をサポートしています。これらの詳細については、こちらのリンクで確認できます。
このブログでは、JWTユーザアサーションの概念を、あまり深く掘り下げることなく、抽出することを試みています。
また、JWT認証の実用的な例については、ブログの最後までお読みください。
キーポイント
前提条件
秘密鍵/公開鍵
- JWTユーザーアサーション方式では、秘密鍵と公開鍵を使用する必要があります。
- この鍵は、JWT ユーザー・アサーションを生成するために必要なペイロードに署名するために使用されます。
- keytool ユーティリティ(JDK がインストールされているすべてのマシンにあります)を使用して、簡単な自己署名付きキー・ペアを生成できます。
Oauth クライアントアプリケーション
- Oracle Integration Cloud のインスタンスごとに、Oracle Identity Cloud Service に機密アプリケーションを登録します。
- この機密アプリケーションは、OIC の OAuth で保護された REST エンドポイントへのアクセスを提供します。
両方の前提条件の手順は、こちら(JWTユーザーアサーションの前提条件)を参照してください。
注:IDCS Trusted storeにアップロードする際に指定した証明書のALIASをメモしておくこと。これは、以降の手順で必要になります。
トークン
JWTユーザーアサーション
- JWTはデータ(クレーム)を含む署名されたJSONペイロードで、ユーザー名、ターゲット、アプリケーションAPIが必要とするスコープを含むことができます。
- これは、生成する必要がある最初のトークンです。
- JWTを作成するためには、まずクレームを表すデータが必要です。
- OICの場合、ヘッダーセクションは - で構成されている必要があります。
{
"alg": "RS256",
"typ": "JWT",
"kid": "<certificateALIAS>"
}
ここで
- alg 署名アルゴリズムはRS256でなければならない(MUST)。
- kid は、署名の検証に使用するキーを指定します。したがって、Oracle Identity Cloud Service にアップロードされた証明書 ALIAS と一致する必要があります。
- ペイロードセクションは以下のように構成される必要があります。
{
"sub": "ssaInstanceAdmin",
"jti": "8c7df446-bfae-40be-be09-0ab55c655436",
"iat": 1589889699,
"exp": 1589909699,
"iss": "d702f5b31ee645ecbc49d05983aaee54",
"aud": "https://identity.oraclecloud.com/"
}
ここで
- sub は、ユーザアサーションが生成されるユーザ名を指定
- jti は一意な識別子
- iatは発行日(エポック秒)
- expはトークンの有効期限(エポック秒)
- iss はクライアント ID
- aud には Oracle Identity Cloud Service のオーディエンス https://identity.oracle.com/ を含める必要があります。
- ヘッダー部とペイロード部はBase64エンコードされ、Header.Payloadとして連結されます。
例
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik9JSldUIn0.eyJzdWIiOiJ1c2VybmFtZUBvcmFjbGUuY29tIiwianRpIjoiOGM3ZGY0NDYtYmZhZS00MGJlLWJlMDktMGFiNTVjNjU1NDM2IiwiaWF0IjoxNjY0NDY1MDEwLCJleHAiOjE2NjQ0NjU1NTAsImlzcyI6IjY4MDU5OTEyN2RkZDQ3NTkzZTQxNGQyYTg5ODg2ZCIsImF1ZCI6Imh0dHBzOi8vaWRlbnRpdHkub3JhY2xlY2xvdWQuY29tLyJ9
- これを、先に生成した秘密鍵を用いて、RS256アルゴリズムで署名します。
- 結果は、ドット(.)で区切られた3つのBase64文字列で、Header.Payload.Signatureの形式となります。
例
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik9JSldUIn0.eyJzdWIiOiJ1c2VybmFtZUBvcmFjbGUuY29tIiwianRpIjoiOGM3ZGY0NDYtYmZhZS00MGJlLWJlMDktMGFiNTVjNjU1NDM2IiwiaWF0IjoxNjY0NDY1MDEwLCJleHAiOjE2NjQ0NjU1NTAsImlzcyI6IjY4MDU5OTEyN2RkZDQ3NTkzZTQxNGQyYTg5ODg2ZCIsImF1ZCI6Imh0dHBzOi8vaWRlbnRpdHkub3JhY2xlY2xvdWQuY29tLyJ9.jaQ2NyGk8wOWWHMGi2QJTsYlKGcHrfqkvP2Gb8AlBbJDQy7NDonXh6YMcAe17iIVaOfH7lDgJyF95xPv3nPHdIezbqobHBck34yct6I6a_xpKcV5kmJfXLHeb9LenqZTbdMMQ95vlUL8R914AmE2TbwGqjl4XkIoADHDez7PVM2MwyIDSfEaQ6o7J05ES7wIgI9gGspQ5w-2Xem4GOare25FBo-LrgVADDiAhKUhSLNT6XISCMAHZ3L2J86cnRhU1fekr-DJYFyfDcgAZeQPSPETHGokBWYtC1K-2qIouODKBKBcooABYEh6YTkC7bdax5KqFFbvJmSfDEjyN3tZ4w
JWTの詳細については、こちらをご覧ください。
このトークンの作成には、以下の作業例が役立ちます。
アクセストークン
JWTのユーザーアサーションが生成されたら、次はIDCSにAccess Tokenをリクエストします。
curlコマンドは以下の通りです。
curl -L -X POST 'https://<idcs-instanceid>.identity.oraclecloud.com/oauth2/v1/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Authorization: Basic <cite><strong><base64-clientid-secret></strong></cite>' \
--data-urlencode 'grant_type=<<cite><strong>grant type></strong></cite>' \
--data-urlencode 'assertion=<cite><strong><user assertion></strong></cite>' \
--data-urlencode 'scope=<cite><strong><app scope></strong></cite>'
EXAMPLE:
--------
curl -L -X POST 'https://idcs-df8f9e70673e4d51aaa9915ca7b2d.identity.oraclecloud.com/oauth2/v1/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Authorization: Basic NjgwNTk5MTI3ZGRkNDc1Mzg5M2U0M4OTg4NmQ6YWRhMmM3NDktY2VlOC00NTEwLTk5MzctNTg2ZWQ3YTJhNDZi' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' \
--data-urlencode 'assertion=eyJhbGciOiJSUzIdWIiOiJ2ZXJub24uai5zYWxkYW5oYUBvcmFjbGUuY29tIiwiYXVkIjoiaHR0cHM6Ly9pZGVudGl0eS5vcmFjbGUuY29tLyIsImp0aSI6IjhjN2RmNDQ2LWJmYWUtNDBiZS1iZTA5LTBhYjU1YzY1NTQzNiJ9.LeSChf2xG28rbwiAJsP_PFsNafxS1iSNkn_xIu7JOW8Fm_ppd2V5UTt01rky18fbXwWSTU9BwCfEs9hFRkYXbH9YxSMZ0yfjz85ZbzgZJe4ZvGNvqFiMxYAMwP5W8DUi7FhPmzH-sT7V9x0y9NSyDzlNwqbdy92XHdz1nfjQj645QHAA8_md4O7K9pTdoYNtauAN01eYCUOr_yaBKhsZfX6hi07aUwRPBTO7AyMsbfk92u_Yk-1CUBIVx7ZPO7c52oO7oo-BhWGNjzm3hhN36avJ9-lAMqwxiH32qFsHOdezS-l8YouwC6pPq7sd5bKQlYvb9XrZo0CCv3sSaVwCvA' \
--data-urlencode 'scope=https://C900A16A892141C6B8A245553E127ACC.integration.ocp.oraclecloud.com:443urn:opc:resource:consumer::all'
ここで
- <グラント タイプ> - urn:ietf:params:oauth:grant-type:jwt-bearer
- <base64-clientid-secret> - Base64でエンコードされたclientId:ClientSecret
- <user assertion> - 上記で生成されたJWTユーザーアサーション
- <app scope> - クライアント設定セクションでアプリケーションを作成する際に追加されたスコープ (末尾は urn:opc:resource:consumer::all です)
認証に成功すると、保護されたリソースにアクセスするためのアクセストークンが手に入ります。
{
"access_token": "eyJ4NXQjG...dfsdfsFgets2ed",
"token_type": "Bearer",
"expires_in": 3600
}
protected APIにアクセスするためのCurlコマンドは以下のようなものです。
curl -L -X GET 'https://OIC host/OIC endpoint' \
-H 'Authorization: Bearer eyJ4NXQjG...dfsdfsFgets2ed'
EXAMPLE:
--------
curl -L -X GET 'https://oicpm-oicpm-px.integration.ocp.oraclecloud.com:443/ic/api/b2b/v1/schemas' \
-H 'Authorization: Bearer eyJ4NXQjUzI1NiI6Il9CbW5LbUV4WlZR5MOm8p3fVy_B1KF-h56dFo-PuTLAt7ZOKCg-CprlBhNiJYamYG_VYVOmzZ_Tb0fRruZEk-toRhGzbo2jckwIGpP2DGse2O1hVfSFSJr0dOatPaQ'
ワーキングコラテラル
JWTユーザアサーションを作成する際に役立つリソースをいくつか紹介します。これらはスターター・コードであることを意図しており、要件に応じて自由に変更・拡張することができます。これらは共依存ではありません。
JWTユーザーアサーションを生成するためのシェルスクリプトです。
注:秘密鍵は、スクリプトファイルと同じ場所に置きます。
- generateJWTUserAssertion.shスクリプトファイルは、添付されています。
OIC統合パッケージ
- TestAPIwithJWT.par ファイルを検索してください。
- このパッケージには、JWT ユーザーアサーションとリクエストを作成するために必要なすべてのアーティファクトが含まれています。
- 必要に応じて、接続の詳細を変更します。
コメント
コメントを投稿