LoginSignup
0
3

More than 3 years have passed since last update.

JWTを利用してSalesforceからMuleSoftのAPIを呼び出そう!

Last updated at Posted at 2020-05-25

はじめに

 Webアプリケーションの標準仕様となっているJWTを利用して、SalesforceからMuleSoftの公開APIに接続する場合の仕組みや制限事項を調査しました。ざっと、調べた内容を並べたので見にくくてすいません。

JWTの概要

 JWTの概要は以下の通りです。今回の検証では署名のみの検証パターンで検証しました。
image.png

外部サービスの概要(API呼び出しに利用)

 外部サービスの概要は以下の通りです。
image.png

外部サービスを利用したJWTの制約事項

外部サービスを利用した場合のJWTの制約事項は以下の通りです。
image.png

Apexを利用したJWTの考慮事項

Apexを利用した場合の考慮事項は以下の通りです。
image.png

署名アルゴリズムの特徴

 認証アルゴリズムの特徴をまとめました。SalesforceではRSAが固定です。
image.png

SalesforceとMule間のJWTの署名と検証の仕組み

SalesforceとMuleSoft間の署名と検証の仕組みは以下の通りです。
image.png

検証までの設定手順

検証を行うために下記の設定手順を実施します。
image.png

ポリシーと互換性があるPEM公開キーの取得

image.png

キーストアの作成

$keytool -genkeypair -keystore keydir/keystore.jks   -dname "CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown"  -keypass password  -storepass password  -keyalg RSA  -sigalg SHA1withRSA  -keysize 2048  -alias mule  -ext SAN=DNS:localhost,IP:127.0.0.1 -validity 9999

公開鍵と非公開鍵の作成

$keytool -importkeystore -srckeystore keydir/keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keydir/keystore.p12
$openssl pkcs12 -in keydir/keystore.p12 -nokeys -out keydir/cert.pem
$openssl x509 -inform pem -in keydir/cert.pem -pubkey -noout > keydir/public.pem
$openssl pkcs12 -in keydir/keystore.p12 -nodes -nocerts -out keydir/key.pem

SalesforceのJWTトークン

 MuleSoftのログからJWTトークンを取得し、JWT Debuggerで内容を可視化しました。
image.png

検証結果(外部サービス)

 アクションコンポーネントのメニューから対象のAPIを設定し配置することで、簡単に呼出しが可能です。
image.png

検証結果(Apex)

 指定ログインの設定も合わせて、JWTトークンを任意の場所に設定することやプライベートクレームを設定もできます。
image.png

public class MuleCallOut {

    public static String getCalloutResponseContents(Boolean flg) {
        String url = 'callout:MuleClientA/{uri_parameter}';
        if (flg) {
            url = 'callout:MuleClientB/{uri_parameter}';
        }
        Http h = new Http();
        HttpRequest req = new HttpRequest();
        req.setHeader('jwt', '{!$Credential.AuthorizationHeaderValue}');
        req.setEndpoint(url);
        req.setMethod('GET');

        // Send the request, and return a response
        HttpResponse res = h.send(req);
        System.debug('>>> Header.Authorization :: ' + req);
        System.debug('>>> getBody :: ' + res.getBody());
        return res.getBody();
    }
}

MessageLoggingポリシーを利用したJWTの確認方法

 MessageLoggingポリシーを利用してJWTの内容をログに出力できます。base64でエンコードされていますので、コアのライブラリのメソッドを指定してデコードします。
image.png

#[dw::core::Binaries::fromBase64((((attributes.headers["jwt"] as String) splitBy("."))[1]) as String)]

まとめ

 JWTトークンを利用してSalesforceからMuleSoftの公開APIの読み出しを検証しました。
 検証により、JWTの仕組みや制限事項が明確になり、ApexやMule実装に必要処理やキーストアが必要な理由についても理解できたと思います。
 お客様との打ち合わせで、要件に合わせて何ができて何ができないのかトレードオフについて「サラっ」とこたえられるようになったら素敵ですね。
 では!

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3