チュートリアル: OIDC セキュリティーの実装

このチュートリアルでは、 API Managerを使用して既存のネイティブOAuthプロバイダにOIDC( OpenID Connect)機能を追加する方法を紹介します。

このチュートリアルについて

OpenID Connect は、OAuth と連携してリソースへのユーザー・アクセスを制御する認証プロトコルです。 OAuth を使用してユーザーの許可を確認する場合、追加で OIDC を使用することで、JSON Web Token (JWT) を使用してユーザーを認証できます。

このチュートリアルでは、以下のレッスンを行います。
  1. OAuth ネイティブ・プロバイダーへの OIDC 機能の追加
  2. OIDC セキュリティーのテスト

開始前に

このチュートリアルでは、定義済みの FindBranch API と、「アクセス・コード」権限付与タイプで構成された既存のネイティブ OAuth プロバイダーを使用します。 このチュートリアル用に環境を準備するには、以下のタスクを実行してください。

  1. カタログの作成と構成で説明したように、 DataPower® API Gateway ゲートウェイサービスを Sandbox カタログに追加します。

    少なくとも 1 つのゲートウェイを使用するように、サンドボックス・カタログを構成する必要があります。 このチュートリアルでは、FindBranch API が使用するゲートウェイと同じゲートウェイを使用する必要があります。

  2. FindBranch API をインポートし、 「チュートリアル: API のインポート 」の説明に従ってアクティブ化します。
  3. 「チュートリアル: OAuth セキュリティの実装」 の説明に従って、 MyNativeOAuthProvider ネイティブ OAuth プロバイダーを作成します。

OAuth ネイティブ・プロバイダーへの OIDC 機能の追加

OIDC セキュリティーをネイティブ OAuth プロバイダーに追加するには、以下のステップを実行します。
  1. 編集のために OAuth プロバイダーを開きます。
    1. API Managerにログインする。
    2. ホーム・ページで、「リソースの管理」タイルをクリックします。
      リソース管理タイル
    3. 「リソース」ナビゲーション・リストで、「OAuth プロバイダー」をクリックします。
    4. OAuth プロバイダーのリストで、「MyNativeOAuthProvider」をクリックして開きます。
      新しいOAuthプロバイダー
  2. Edit Native OAuth Provider] ナビゲーションリストで、 [ OpenID Connect ]をクリックします。OIDCフォーム
  3. OpenID Connect ページで、 Enable OIDCを選択する。

    OIDCフォーム

  4. 同じページの「サポートされるハイブリッド応答タイプ」リストでいずれかの設定が選択されている場合は、選択をクリアします。
  5. 「OIDC API アセンブリーの自動生成」を選択します。

    このオプションは、OIDC のフローで API を更新します。

    自動生成の設定

    ID トークン署名暗号オブジェクトまたは ID トークン署名鍵のいずれかを指定する必要があることを警告するメッセージが表示されます。 このチュートリアルでは、(次のステップで) JWK 鍵を指定します。

  6. 「コピー」アイコン 」をクリックして以下のキーをコピーし、「 IDトークン署名キー」 フィールドに貼り付けます:
    { "alg": "HS256", "kty": "oct", "use": "sig", "k": "o5yErLaE-dbgVpSw65Rq57OA9dHyaF66Q_Et5azPa-XUjbyP0w9iRWhR4kru09aFfQLXeIODIN4uhjElYKXt8n76jt0Pjkd2pqk4t9abRF6tnL19GV4pflfL6uvVKkP4weOh39tqHt4TmkBgF2P-gFhgssZpjwq6l82fz3dUhQ2nkzoLA_CnyDGLZLd7SZ1yv73uzfE2Ot813zmig8KTMEMWVcWSDvy61F06vs_6LURcq_IEEevUiubBxG5S2akNnWigfpbhWYjMI5M22FOCpdcDBt4L7K1-yHt95Siz0QUb0MNlT_X8F76wH7_A37GpKKJGqeaiNWmHkgWdE8QWDQ", "kid": "hs256-key" }

    この鍵はセキュアではなく、このチュートリアルでの使用のみを目的としています。

    ID トークン署名キー
  7. 「ID トークン署名アルゴリズム」フィールドで、この鍵の署名アルゴリズムに HS256 を選択します。

    ID トークン署名アルゴリズム

  8. 保存 をクリックします。

OIDC セキュリティーのテスト

注: Cross-Origin Resource Sharing (CORS) の制限により、アセンブリテストツールは、 macOS Catalina プラットフォームの Chrome または Safari ブラウザでは使用できません。

API Manager のテストパネルで新しい OIDC セキュリティをテストする場合、ネイティブ OAuth プロバイダのテストと同じ手順を実行します。 「テスト」パネルには、アクセス・トークンとともに受信した JWT トークンは表示されないため、このチュートリアルでは、トークンが返されたことを確認できるように cURL コマンドを使用して JWT トークンを取得します。

  1. 以下のようにして、API を呼び出すように「テスト」パネルをセットアップします。
    1. Develop / findbranch ページで、ページヘッダーの Test タブをクリックする。

      インポートされた FindBranch APIにはすでに定義があり、 Invoke という単一のポリシーを使ってAPIを実行する。 この API はテストする準備ができています。

    2. APIを有効にするには、 Target Configurationをクリックする。

      FindBranch API

    3. Preferences ウィンドウで、 Auto-publishを切り替えて APIのステータスをオンラインに設定する。

      テスト・パネル

    4. 送信をクリックする。

      テストの呼び出し

    5. 応答がありません 」というメッセージが表示されたら、「 サーバーを開く 」をクリックします。

      応答メッセージなし

      新しいブラウザー・タブが開きます。 エラーメッセージが表示されても無視してください。

  2. 以下のようにして、コマンド・ウィンドウに切り替えて cURL コマンドを使用し、API の使用を許可するアクセス・トークンと JWT トークンを取得します。
    注: OAuthプロバイダーから受け取った認証コードは、数分後に失効します。 この要求を繰り返し行う必要がないように、このステップで使用するコマンドを両方ともできるだけ準備しておいてから、最初のコマンドを実行するようにしてください。
    1. 以下の cURL コマンドを実行して、API の許可コードを要求します。
      curl -k -i --header "Authorization: Basic dXNlcjpwYXNz"\
       --request GET "Authorization_URL\
      ?redirect_uri=https://example.com/redirect\
      &scope=openid+details\
      &response_type=code\
      &client_id=Client_ID"
      ここで:
      • cURL パラメーター -k を使用すると、セキュアでないサーバー接続であっても cURL が操作を実行できます。
      • cURL パラメーター -i を使用すると、出力にプロトコル応答ヘッダーが含まれるため、コマンド・ウィンドウで応答を表示できます。
      • 許可ヘッダーには、基本認証を使用してユーザー・レジストリー (作成した AuthURL ユーザー・レジストリー) で認証を行うことを指定し、base64 でエンコードしたパスワード (「pass」) を提供します。
      • Authorization_URL は、「テスト」パネルからコピーします。
      • redirect_uri は、サンドボックス・テスト・アプリケーションで構成した OAuth リダイレクト URLです。
      • scope 、2つのスコープを +で連結して指定する:アクセスするAPIの details スコープと、あなたを認可するOIDCスコープである。
      • response_typecode にします。許可コードを受け取るためです。
      • Client_ID は Test パネルの Identification セクションからコピーされ、Sandbox Test App にアクセスできるようにします。
      例:
      curl -k -i --header "Authorization: Basic dXNlcjpwYXNz"\
       --request GET "https://example.com/eb-org/sandbox/mynativeoauthprovider/oauth2/authorize\
      ?redirect_uri=https://example.com/redirect\
      &scope=openid+details\
      &response_type=code\
      &client_id=01c43d1620e0c4e6ded0dec20b5655d9"
      応答は次の例のようになります。
      HTTP/1.1 302 Found
      Connection: Keep-Alive
      Transfer-Encoding: chunked
      X-RateLimit-Limit: name=default,100;
      X-RateLimit-Remaining: name=default,93;
      User-Agent: curl/7.55.1
      Accept: */*
      X-Client-IP: IP_address
      X-Global-Transaction-ID: 12df8d855e7e18ee00000681
      Location: https://example.com/redirect? code=AALxLnKixp9VIy3PvVKBwfbuTgNbwnZtHB6iS9b_BUw39UZZjUi2CeFdPYJZW0mgqNMtzFUhrsfu3FFiC9aGfHnJ3CqdIANqlo-v-DkQv7ELWw 
      Content-Type: text/xml
      Date: Fri, 27 Mar 2020 15:17:02 GMT
    2. 次のステップで使用できるように、許可コード (code パラメーターで返されたもの) をコピーします。
    3. 以下の cURL コマンドを実行して、許可コードをアクセス・トークンと JWT トークンに交換します。
      curl -k -i --header "Content-Type: application/x-www-form-urlencoded"\
       --request POST "Token_URL"\
       --data-urlencode "code=Authorization_code"\
       --data-urlencode "client_secret=Client_Secret"\
       --data-urlencode "grant_type=authorization_code"\
       --data-urlencode "scope=openid details"\
       --data-urlencode "client_id=Client_ID"
      ここで:
      • Token_URL は、「テスト」パネルからコピーします。
      • Authorization_code は、前のコマンドの応答からコピーしたものです。
      • Client_Secret は、「テスト」パネルの「識別」セクションからコピーします。
      • grant_type は、「authorization_code」です。
      • scope には、再び 2 つのスコープを指定します (このコマンドでは値を引用符で囲むため、スペースで区切ります)。
      • Client_ID は、「テスト」パネルの「識別」セクションからコピーします。
      例:
      curl -k -i --header "Content-Type: application/x-www-form-urlencoded"\
       --request POST "https://example.com/eb-org/sandbox/mynativeoauthprovider/oauth2/token"\
       --data-urlencode "code=AAJ8zz5SvYgxFw0zY0fOxAOiDeaw_PLR6dAFh-ojXVjv-80TB25VGfj28J4Jf7jzgaWVVfLQuVTRSfUbp2hDjYsX9QmZHJOg5p_bfHFWBlQlLg"\
       --data-urlencode "client_secret=d6634763de6c612ae69636d0fc948650"\
       --data-urlencode "grant_type=authorization_code"\
       --data-urlencode "scope=openid details"\
       --data-urlencode "client_id=01c43d1620e0c4e6ded0dec20b5655d9"
      応答は次の例のようになります。
      {"token_type":"Bearer", "access_token":"AAIgMDFjNDNkMTYyMGUwYzRlNmRlZDBkZWMyMGI1NjU1ZDkm4gPMmFjgv2XXhI7t6LZ8BcIRaO_LvWirsNDlirJWi_7qqKGp_fr5py7yE_fHoD17ajAUJPPuUjsV5xj7go25JQjk_smS-AYvmPXRi99IxQ" ,"scope":"openid details","expires_in":3600,"consented_on":1585322249, "id_token":"eyJraWQiOiJoczI1Ni1rZXkiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3NjE2OTRiYS1iYjYzLTRlNWQtOTc1ZS04NThkZGYxMmI2ZTkiLCJpc3MiOiJJQk0gQVBJQ29ubmVjdCIsInN1YiI6InVzZXIiLCJhdWQiOiIwMWM0M2QxNjIwZTBjNGU2ZGVkMGRlYzIwYjU2NTVkOSIsImV4cCI6MTU4NTMyNTg1MiwiaWF0IjoxNTg1MzIyMjUyLCJhdF9oYXNoIjoibDZYRDV5SjVuMTU1MkZSV19pR2k2USJ9.IO1RVPWV5zOhYGmCXUvG0_-9OO0guURPwaEbGOqCpCg" }

      レスポンスには、アクセストークンとJWT( id_tokenというラベル)の2つのトークンが含まれる。 これらのトークンを受け取ることで、OIDC とネイティブ OAuth プロバイダーを使用して認証されていることを検証します。

      注意: もしInvalid requestのレスポンスに期限切れコードに関するエラーがあった場合、認証コードの有効期限が切れたことを意味します。 サブステップ a に戻ってプロセスを繰り返し、新しい許可コードを取得してから、アクセス・トークンおよび JWT トークンに迅速に交換します。
  3. Testパネルに戻り、 SendをクリックしてAPIを実行する。

    API Connect で cURL を使用してトークンを交換済みであるため、コードを「テスト」パネルに貼り付ける必要はありません。

    FindBranch API のレスポンスには Status コードが表示される200 OKとレスポンス・ヘッダ情報が含まれ、ボディには各銀行支店のデータが含まれる。

    APIコールに成功した場合のレスポンス

このチュートリアルで実行したこと

このチュートリアルでは、以下のアクティビティーを実行しました。
  • OIDC セキュリティーを既存の API に追加しました。
  • API を呼び出す前に、許可コードを手動で要求し、それをアクセス・トークンと JWT トークンに交換することで、セキュリティーをテストしました。