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


はじめに

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

JWTの概要

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

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

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

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

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

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

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

署名アルゴリズムの特徴

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

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

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

検証までの設定手順

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

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

キーストアの作成

$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で内容を可視化しました。

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

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

検証結果(Apex)

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

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でエンコードされていますので、コアのライブラリのメソッドを指定してデコードします。

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

まとめ

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