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ベースの認証方法のいくつかの異なる方法をサポートしています。これらの詳細については、こちらのリンクで確認できます。


https://docs.oracle.com/en/cloud/paas/integration-cloud/rest-adapter/authentication-support.html#GUID-A425ABFB-56BC-4545-A94B-463D0D487847


 


このブログでは、JWTユーザアサーションの概念を、あまり深く掘り下げることなく、抽出することを試みています。


また、JWT認証の実用的な例については、ブログの最後までお読みください。



キーポイント

前提条件


 

秘密鍵/公開鍵


  1.     JWTユーザーアサーション方式では、秘密鍵と公開鍵を使用する必要があります。
  2.     この鍵は、JWT ユーザー・アサーションを生成するために必要なペイロードに署名するために使用されます。
  3.     keytool ユーティリティ(JDK がインストールされているすべてのマシンにあります)を使用して、簡単な自己署名付きキー・ペアを生成できます。


 

Oauth クライアントアプリケーション


  1.     Oracle Integration Cloud のインスタンスごとに、Oracle Identity Cloud Service に機密アプリケーションを登録します。
  2.     この機密アプリケーションは、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ユーザーアサーションを生成するためのシェルスクリプトです。

注:秘密鍵は、スクリプトファイルと同じ場所に置きます。



 

OIC統合パッケージ


  •     TestAPIwithJWT.par ファイルを検索してください。
  •     このパッケージには、JWT ユーザーアサーションとリクエストを作成するために必要なすべてのアーティファクトが含まれています。
  •     必要に応じて、接続の詳細を変更します。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)