CData SyncでSalesforceへの接続にOAuthJWTを使う

## CData Syncとは

CData Syncは多くのSaas, DBのデータを別のDBやDWHに同期するためのETLアプリケーションです。
200種類以上のデータソースが用意されており、大体のSaas,DBのデータに接続できるかと思います。

CData Syncの特徴については、[こちら](https://www.cdata.com/jp/blog/about_cdatasync)の記事が分かりやすいかと思います。ご参考にどうぞ。

## CData SyncからSalesforceに接続する

CData Syncに用意されているデータソースにはSalesforceも含まれております。
すなわち、Salesforceをデータソースとして、他のDBにデータを同期させることができます。

CData SyncからSalesforceに接続する方法としては、以下のものが用意されています。
* Basic
* OAuth
* OAuthPassword
* OAuthJWT
* OneLogin
* PingFederate
* OKTA
* ADFS
* AzureAD

よく使われるパターンとしては、Basic(ユーザ名とパスワード)だと思いますが、今回は「OAuthJWT」を使う手順について紹介します。
（いざ試そうとして、ちょっとだけハマってしまったので...）

Salesforceへの接続方法としては、[JWT Bearer Tokenフロー](https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm&type=5&language=ja)というものがありまして、この方法を使って、CData Syncから接続する、という具合になります。

## 使用するCData Syncのバージョン

今回使用するCData Syncのバージョンは、`23.2.8659.0`になります。

## 事前準備

### 1. JWTの電子署名を行うための秘密鍵および証明書を用意

以下、OpenSSLを使ってRSA公開暗号鍵ペアを生成し、自己証明書を作成するコマンドのサンプルになります。有効期限は適宜変更してお試しください。

```
$ openssl genrsa 2048 > sfdc.pem
$ openssl req -new -key sfdc.pem -out sfdc.csr
(...略)
$ openssl x509 -req -days 3650 -in sfdc.csr -signkey sfdc.pem -out sfdc.crt
```

### 2. Salesforceへ接続するための接続アプリケーションを作成

接続先のSalesforce組織の管理者アカウントでログインして、接続アプリケーションを作成します。

![screenshot_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/cca1f8e1-1fca-8c1f-6bc3-8c6e01bac6f5.png)

接続アプリケーションの作成画面で、「API(OAuth 設定の有効化)」にチェックを入れると、設定メニューが表示されますので、チェックを入れてください。

1. コールバックURL
    * 今回は使いませんが、Salesforceが用意しているログインURLでも指定しておきます。
2. デジタル署名
    * 先ほど作成した`sfdc.crt`を選択します。
3. 選択したOAuth範囲
    * 「フルアクセス」と「ユーザに変わっていつでも要求を実行」を指定します。

![screenshot_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/5b714dc5-e26d-5d1f-37b8-b5625f4a6327.png)

### 3. 接続アプリケーションの設定を変更

接続アプリケーションを作成した後、接続アプリケーション画面の「Manage」ボタンをクリックして、接続アプリケーションの詳細画面に移動します

![screenshot_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/53e92403-fcb4-1a53-43d5-716c013c1792.png)

「ポリシーを編集」ボタンをクリックして、OAuthポリシーを編集します。
編集画面内の「OAuthポリシー」セクションで、許可されているユーザとして「管理者が承認したユーザは事前承認済み」を選択して保存します。

![screenshot_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/18691480-6ad2-bfa1-a2ba-41cd0c7b7bd9.png)

そして、そのままの画面で、「プロファイル」関連リストから、接続を許可するユーザのプロファイルを選択してリストに追加します。「プロファイルを管理する」ボタンで、プロファイルを選択する画面に移動しますので、そこでプロファイルを指定ください。
＊大抵は「システム管理者」プロファイルになると思いますが、接続したいユーザのプロファイルを指定ください。

![screenshot_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/d240f66a-fbc2-44d3-645c-8475c46cf08e.png)

### 4. `client id`と`client secret`を取得

最後に、接続アプリケーションの`client id`と`client secret`を取得します。
接続アプリケーションの管理画面に戻って（あるいは、アプリケーションマネージャーから作成した接続アプリケーションに移動）、「コンシューマーの詳細を管理」ボタンをクリックします。

![screenshot_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/2ef2ad78-a903-fed9-a187-a65300f43ffc.png)

別タブが開いて、IDを検証する画面が開きます。
確認コードはメールで通知されますので、メールをご確認ください。（件名が「SalesforceでIDを確認」というメールです）

![screenshot_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/de536c68-77aa-894b-de19-38b0b8500a64.png)

確認コードによる検証が正常に完了すると、`client id`と`client secret`が表示された画面に移動します。

![screenshot_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/030e5a55-1df7-f7b5-1950-50abc80c0978.png)

ここで「コンシューマー鍵」をコピーしておきます。

## CData SyncでSalesforceへの接続を作成する

ここからCData Syncにうつります。（ようやく）
管理画面から「接続」 > 「+接続を追加」で新規接続を作成します。

![screenshot_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/792bf7b0-9edf-39f5-837a-0380d1f8e58c.png)

データソースタブで「Salesforce」を選択します

![screenshot_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840/62c6e715-ca36-0db4-cb7b-128c1ee12433.png)

「新しい接続」画面で、以下のように値を設定します

|項目|設定する値|
|:--|:--|
|接続名|(接続名は任意に指定ください)|
|Auth Scheme|`OAuthJWT`|
|OAuth JWT Cert|(接続アプリケーションの用意で作成した秘密鍵の内容をそのままセット)[^1]|
|OAuth JWT Cert Type|`PEMKEY_BLOB`|
|OAuth JWT Issuer|(接続アプリケーションのclient id(コンシューマー鍵)|
|OAuth JWT Cert Password|`.csr`ファイルを作成する際に指定したパスワード<br>(指定してなければ空のまま)|
|OAuth JWT Cert Subject|`*`|
|OAuth JWT Subject|(接続するSalesforceユーザID)|
|API Version|(デフォルトの`56.0`で構いません)|
|Login URL|sandbox環境 -> `https://test.salesforce.com`<br>production環境 -> `https://login.salesforce.com`|
|Use Sandbox|sandbox環境 -> `true`<br>production環境 -> `false`|

設定が正しければ、最下部にある「Salesforceへの接続」ボタンをクリックして、接続に成功するかどうか検証します。接続に成功すれば、完了です。

## さいごに

CData Syncの古いバージョンでは、Basic(ユーザ名とパスワードで接続)か、OAuthで接続するようになっていたと思います。諸事情でBasicを指定して運用しておりました。
そういった運用の場合、Salesforce側でパスワード変更が発生すると、CData Syncでもパスワードを入れ直さないと接続できなくなります。
そのような事故を回避するための策として、OAuthJWTを使って接続するというのも良いかと思いますので、試してみてください。（お試しする際には、まずはSandbox環境で）

ただ、Salesforce接続アプリケーションの証明書が切れたら、似たような事故になってしまいますので、そこだけご注意ください。

もし、接続設定でうまくいかない場合、CData社のサポートも活用してみてください。
レスポンスが良く、非常に親身に粘り強くサポートして頂けるので、大変有難いです。
（いつもありがとうございます）

それでは非常に楽チンなCData Syncご利用を！

（本記事は[CData Software Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cdatasoftware)の3日目の記事になります）

[^1]: CData Syncの古いバージョンだと、入力フィールドが複数行可能なテキストエリアになっていないかもしれません。その場合は、秘密鍵ファイルの内容を改行コードを全て除去して1行にしてセットしてみてください。