SalesforceではSOAP API login() の廃止が予定されていますが、データローダーバッチモードでは現時点で公式に代替案への対応がされていない状況のようです。
そこでクライアントログイン情報フローで認証できるデータローダーを作成してみました。
非公式配布版はこちらです。
https://github.com/ponpoke/dataloader-client-credentials-release
Salesforce公式データローダーへのPull Requestを作成しています。
https://github.com/forcedotcom/dataloader/pull/1666
この記事では、配布版の使い方を説明します。
このデータローダーはSalesforce公式リリースではありません。
非公式の変更版であり、公式サポートの対象外です。
本番環境およびSandboxで利用する場合、自己責任でお願いします。
1. 配布版データローダーをダウンロードとインストールをする
GitHubの配布用リポジトリを開きます。
https://github.com/ponpoke/dataloader-client-credentials-release/releases/tag/client-credentials-v67.0.0-1
「dataloader-client-credentials-v67.0.0.zip」をダウンロードし、任意のディレクトリに展開します。
例えば、
C:\Users\username\Downloads\dataloader-client-credentials-v67.0.0
へ展開します。
以降は、この中にある install.bat を実行して、インストールを完了します。
2. Salesforceで外部クライアントアプリケーションを作成する
Salesforceの設定画面を開きます。
設定 → 外部クライアントアプリケーションマネージャー
[新規外部クライアントアプリケーション] をクリックします。
基本情報
以下を設定します。
| 項目 | 設定 |
|---|---|
| 外部クライアントアプリケーション名 | 任意 |
| API参照名 | 任意 |
| 取引先責任者メール | 任意 |
| 配信状態 | ローカル |
OAuth設定
「API(OAuth設定の有効化)」では以下を設定します。
| 項目 | 設定 |
|---|---|
| OAuthを有効化 | チェック |
| コールバックURL | https://localhost:3000/ |
| 利用可能なOAuth範囲 | APIを使用してユーザーデータを管理 (api) |
| クライアントログイン情報フローを有効化 | チェック |
上記を設定したら作成します。
クライアントログイン情報フローではコールバックURLを実際の認証には使用しません。
3. 実行ユーザーを設定する
作成した外部クライアントアプリケーションを開きます。
ポリシー → 編集
以下を設定します。
| 項目 | 設定 |
|---|---|
| クライアントログイン情報フローを有効化 | チェック |
| (ユーザー名)として実行 | Data Loaderを実行するユーザー |
| IP制限の緩和 | 組織のポリシーに合わせて設定 |
ここで指定したユーザーの権限でデータローダーが実行されます。
4. コンシューマー鍵とコンシューマーの秘密を取得する
外部クライアントアプリケーションの 「設定」から「コンシューマー鍵と秘密」をクリックして、以下の2つを取得します。
コンシューマー鍵
コンシューマーの秘密
5. データローダーの設定ディレクトリを作る
データローダーをインストールしたディレクトリにて、例えば、以下ディレクトリを作成します。
C:\Users\username\dataloaderconfig
最終的な構成のイメージは次のとおりです。
C:\Users\username\dataloaderconfig\
│
├── config.properties
├── process-conf.xml
├── dataloader.key
└── その他のmappingファイルなど
6. 暗号化キーファイルを作成する
PowerShellを開いてデータローダーの bin ディレクトリへ移動します。
cd "C:\Users\username\Downloads\dataloader-client-credentials-v67.0.0\bin"
暗号化キーファイルを作ります。
.\encrypt.bat -k "C:\Users\username\dataloaderconfig\dataloader.key"
成功すると、
Keyfile "C:\Users\username\dataloaderconfig\dataloader.key" was created!
のように表示されます。
dataloader.key はコンシューマーの秘密を復号するために必要なので、削除しないでください。
また、GitHubなどへ公開しないようにしてください。
7. コンシューマーの秘密を暗号化する
外部クライアントアプリケーションから取得したコンシューマーの秘密を暗号化します。
.\encrypt.bat -e "取得したコンシューマーの秘密" "C:\Users\username\dataloaderconfig\dataloader.key"
例えば、
.\encrypt.bat -e "xxxxxxxxxxxxxxxxxxxx" "C:\Users\username\dataloaderconfig\dataloader.key"
とします。
実行すると暗号化済みの文字列が表示されるのでコピーします。
ここで暗号化するのはコンシューマーの秘密のみです。
コンシューマー鍵は暗号化しません。
8. config.propertiesを作成する
以下を、
C:\Users\username\dataloaderconfig\config.properties
に作成します。
sfdc.oauth.flow=client_credentials
sfdc.oauth.Production.eca.clientid=コンシューマー鍵
sfdc.oauth.Production.eca.clientsecret=7.で暗号化したコンシューマーの秘密
process.encryptionKeyFile=C:/Users/username/dataloaderconfig/dataloader.key
例えば、
sfdc.oauth.flow=client_credentials
sfdc.oauth.Production.eca.clientid=3MVG9xxxxxxxxxxxxxxxxxxxxxxxx
sfdc.oauth.Production.eca.clientsecret=0123456789abcdef0123456789abcdef...
process.encryptionKeyFile=C:/Users/username/dataloaderconfig/dataloader.key
となります。
Windowsのパスに注意
.properties ファイルでは \ がエスケープ文字になります。
そのため、
process.encryptionKeyFile=C:/Users/username/dataloaderconfig/dataloader.key
のように / を使うのが簡単です。
\ を使う場合は、
process.encryptionKeyFile=C:\\Users\\username\\dataloaderconfig\\dataloader.key
とします。
9. process-conf.xmlを設定する
通常のデータローダーバッチと同じように process-conf.xml を作成します。
例えばAccountをExtractする処理なら、イメージは以下のようになります。
<entry key="sfdc.endpoint"
value="https://login.salesforce.com"/>
<entry key="sfdc.entity"
value="Account"/>
<entry key="process.operation"
value="extract"/>
<entry key="sfdc.extractionSOQL"
value="SELECT Id, Name FROM Account"/>
<entry key="dataAccess.type"
value="csvWrite"/>
<entry key="dataAccess.name"
value="C:\Users\username\dataloaderconfig\Account.csv"/>
クライアントログイン情報フローの場合、
sfdc.username
sfdc.password
は不要です。
以前のデータローダー設定を流用する場合、古い sfdc.password が残っている場合は削除しておくことをおすすめします。
10. クライアントログイン情報フローを実行する
クライアントログイン情報フローの bin ディレクトリから実行します。
例えば accountInsert というプロセスなら、
.\process.bat "C:\Users\username\dataloaderconfig" accountInsert
Extractなら例えば、
.\process.bat "C:\Users\username\dataloaderconfig" csvAccountExtractProcess
です。
通常のクライアントログイン情報フローと同じ、
process.bat "<設定ディレクトリ>" <プロセス名>
という形式のまま使えます。
なお、初回実行時のみブラウザが起動して、外部クライアントアプリケーションの認証が必要です。
11. 認証に成功したか確認する
正常にクライアントログイン情報フローで認証されると、ログに以下が表示されます。
OAuth Client Credentials Flow completed successfully using External Client App
続いて、
Using session id from OAuth Client Credentials Flow to establish Salesforce session
さらに、
Login succeeded
と表示されれば認証成功です。
ブラウザログインは発生しません。
ユーザー名・パスワードによる認証も行いません。
12. Sandboxの場合
SandboxではSandbox用の外部クライアントアプリケーションの認証情報を設定します。
sfdc.oauth.Sandbox.eca.clientid=YOUR_SANDBOX_CONSUMER_KEY
sfdc.oauth.Sandbox.eca.clientsecret=YOUR_ENCRYPTED_SANDBOX_CONSUMER_SECRET
接続先は通常、
https://test.salesforce.com
です。
Productionでは通常、
https://login.salesforce.com
を使用します。
まとめ
使い方を簡単にまとめると、
1. 配布版データローダーをダウンロードとインストール
2. 外部クライアントアプリケーションを作成
3. クライアントログイン情報フローを有効化
4. 実行ユーザーを設定
5. コンシューマー情報を取得
6. コンシューマーの秘密をencrypt.batで暗号化
7. config.propertiesを設定
8. process-conf.xmlを設定
9. process.batを実行
です。
※ 本プロジェクトは非公式の変更版であり、Salesforce 社による
承認、推奨、サポートを受けたものではありません。



