[Talend]tSalesforceConnectionを利用してSalesforceに接続しようとしてみた(OAuth接続)

今回はTalendのコンポーネント「tSalesforceConnection」(OAuth接続)を紹介したいと思います。
2018.10.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。DI部の大高です。

今回はTalendのコンポーネント「tSalesforceConnection」(OAuth接続)を紹介したいと思います。

が、タイトルのとおり今回は残念ながら「接続しようとしてみた」のですがうまくいかなかったので「なにをどうやったらうまくいかなかったのか」をご紹介できればと思います。

Basic接続については別記事でご紹介していますので、こちらもご覧ください。

[Talend]tSalesforceConnectionを利用してSalesforceに接続する(Basic接続) | DevelopersIO

なお、こちらの記事を作成するにあたり以下の記事を参考にさせて頂きました。

OAuth2 JWT Bearer Token フローを使ってSalesforceへアクセスする

前提条件

Talendのバージョンは「Talend Open Studio for Big Data」の「Version 7.0.1」、Salesforceのバージョンは「Winter '19」で検証しています。

なお、Salesforceのアカウントが無い場合には、以下から開発者環境を無料で新規作成することができます。

Salesforce Developers

tSalesforceConnectionについて

「tSalesforceConnection」を利用すると、Salesforceに接続をすることができ、その後の「tSalesforceInput」、「tSalesforceInput」コンポーネントなどでコネクションを利用することができます。

「tSalesforceConnection」コンポーネントのTalend Helpページはこちらです。

tSalesforceConnection

では、具体的に以下で解説していきます。

ジョブの説明

今回は「tSalesforceConnection」で接続確認をするだけとなっており、コンポーネントを置いただけとなります。なお、左側がBasic接続、右側がOAuth接続をする設定にしたコンポーネントです。

Salesforceでの下準備

OAuth接続をするにはSalesforce側で下準備が必要です。

tSalesforceConnectionでOAuth接続を選択した場合、認証フローとして「Json Web Token Flow」が選択できます。(認証フローの詳細は以下のSalesforceのヘルプに記載されています)

OAuth 2.0 JWT べアラートークンフロー

この認証フローを利用するにあたり、「自己証明書」の作成と「接続アプリケーション」の設定が必要となります。

「自己証明書」の作成は、Talendのヘルプにもあるのですが、Salesforceの「自己署名証明書の作成」から作成することができます。

自己署名証明書の生成

設定画面の「設定 > セキュリティ > 証明書と鍵の管理」を開き、「自己署名証明書の作成」をクリックします。

設定は以下のように設定しました。

作成できたら、「証明書のダウンロード」ボタンをクリックしてダウンロードしておきます。

次に「接続アプリケーション」の設定です。設定画面の「プラットフォームツール > アプリケーション > アプリケーションマネージャ」を開き、「新規接続アプリケーション」をクリックします。

必須項目である「接続アプリケーション名」、「API参照名」、「取引先責任者メール」を入力します。メールアドレスには自分のメールアドレスを設定しました。

次に「OAuth接続の有効化」にチェックを入れて、OAuthの設定を行います。

「コールバックURL」は利用しないのですが必須なのでSalesforceが持っているエンドポイント「https://login.salesforce.com/services/oauth2/success」を指定しておきます。

「デジタル署名を使用」にチェックを入れて、先ほどダウンロードした「自己署名証明書」をアップロードします。

また、「選択したOAuth範囲」に「フルアクセス (full)」と「ユーザに代わっていつでも要求を実行 (refresh_token, offline_access)」を指定しておきます。

接続アプリケーションを作成したら、表示される画面の「コンシューマ鍵」を控えておきます。(後でtSalesforceConnectionの設定に使います)

また、続けて「Mange」ボタンをクリックして設定を続けます。

更に「ポリシーを編集」をクリックします。

「許可されているユーザ」を「管理者が承認したユーザは事前承認済み」に設定して保存します。

これでSalesforce側の設定は終わりです。

JKS(Java KeyStore)の準備

もう1つ下準備が必要で、今度はJKSの準備です。

Salesforceからダウンロードした「自己署名証明書」の「Salesforce.crt」ですが、これをJKSにインポートして利用できるようにしておきます。

なお今回は「C:\tmp」配下で作業を行いましたので、以下はすべて「C:\tmp」でのコマンド実行となっています。また、JKSですが新規作成した場合に証明書チェーンの関係か、うまく自己署名証明書がインポートできなかったので、JREのフォルダにある標準のJKSを流用しました。

作業としては、作業フォルダにダウンロードした「Salesforce.crt」をおいてから下記のようにコマンドを実行します。

C:\tmp>copy "C:\Program Files\Java\jdk1.8.0_181\jre\lib\security\cacerts" .
        1 個のファイルをコピーしました。

C:\tmp>"C:\Program Files\Java\jdk1.8.0_181\bin\keytool.exe" -importcert -alias salesforce -file Salesforce.crt -keystore cacerts -storepass changeit
所有者: C=USA, ST=CA, L=San Francisco, O=Salesforce.com, OU=00D100000001wyh, CN=Salesforce
発行者: C=USA, ST=CA, L=San Francisco, O=Salesforce.com, OU=00D100000001wyh, CN=Salesforce
シリアル番号: 166a3a43e0d00000000564ef802
有効期間の開始日: Wed Oct 24 10:15:41 JST 2018 終了日: Thu Oct 24 09:00:00 JST 2019
証明書のフィンガプリント:
         MD5:  21:97:9A:92:5B:87:9F:AD:96:22:62:0D:38:C9:25:90
         SHA1: FB:E8:D4:A4:63:AF:30:52:2E:C5:28:3F:63:E4:A0:6F:5E:96:65:26
         SHA256: CD:8D:0E:7B:9A:5C:06:01:BB:35:2C:8B:CD:ED:E6:A1:D8:65:9B:47:C0:28:EF:D2:4A:55:B0:12:1B:73:F1:13
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3

拡張:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 82 1F F0 9D 1C 05 54 5F   45 9C 54 2C 6A 98 EF 03  ......T_E.T,j...
0010: 8A FA 8D 55                                        ...U
]
[C=USA, ST=CA, L=San Francisco, O=Salesforce.com, OU=00D100000001wyh, CN=Salesforce]
SerialNumber: [    0166a3a4 3e0d0000 0000564e f802]
]

#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 82 1F F0 9D 1C 05 54 5F   45 9C 54 2C 6A 98 EF 03  ......T_E.T,j...
0010: 8A FA 8D 55                                        ...U
]
]

この証明書を信頼しますか。 [いいえ]:  y
証明書がキーストアに追加されました

これで、JKSに証明書がインポートされました。

なお、追加した自己署名証明書のエイリアス名としては「salesforce」を指定しています。また、cacertの初期パスワードは「changeit」なので「-storepass」オプションの値として「changeit」を指定しています。

これで下準備ができました!

「tSalesforceConnection」コンポーネントの設定

いよいよ「tSalesforceConnection」コンポーネントの設定です。

「tSalesforceConnection」コンポーネントでは接続の種類を「Basic」と「OAuth」から選択が可能ですが、今回は「OAuth」についてです。

接続の種類

「Basic」と「OAuth」があり、「OAuth」を選択すると、「OAuth」接続用の設定がその下に自動で表示されます。

Oauth2 flow type

「Json Web Token Flow」を指定します。なお「Implicit Flow (Deprecated)」もありますが、表示のとおり非推奨となったようです。

Issuer

ここには先程Salesforceの画面で控えた、接続アプリケーションの「コンシューマ鍵」(3MVG9...7xeuU)を指定します。

Subject

ここにはSalesforceのログインユーザ名を指定します。

Expiration time (in seconds)

有効期限(秒)を指定します。Salesforceのヘルプによると5分(300秒)以内に設定する必要があるそうです。

Key store

先程下準備をしたJKSファイル(/tmp/cacerts)を指定します。

Key store password

JKSのパスワードです。これは「changeit」ですね。

Certificate alias

証明書のエイリアス名です。これは先程インポート時に指定した「salesforce」です。

SalesforceのURL

「詳細設定」の「SalesforceのURL」ですが、こちらはSalesforceの環境によって設定が変わります。

デフォルトの設定だと「https://www.salesforce.com/services/Soap/u/42.0」になっているので、これを少し変更します。

Salesforceの環境が「本番環境」、「開発環境」の場合には「https://login.salesforce.com/services/Soap/u/44.0」とし、「Sandbox環境」の場合には「https://test.salesforce.com/services/Soap/u/44.0」とします。

なお、最後の「44.0」はSalesforceの「Winter '19」に対応するAPIのバージョン番号です。

デフォルトの「https://www.salesforce.com/services/Soap/u/42.0」のエンドは「2018/04/20」をもって廃止されているので注意が必要です。

www.salesforce.com API Endpoint Retirement

APIのバージョン

バージョンにはURLと合わせて「44.0」を指定します。

実行結果

設定は以上です。このジョブを実行すると接続できるはず!と思っていたのですが、実際には以下のエラーが発生しています。

[statistics] connecting to socket on port 3999
[statistics] connected
Exception in component tSalesforceConnection_2 (tSalesforceConnection)
java.lang.RuntimeException: RuntimeException: Certificate salesforce can't be found in the store /tmp/cacerts
	at sandbox.tsalesforceconnection_0_1.tSalesforceConnection.tSalesforceConnection_2Process(tSalesforceConnection.java:485)
	at sandbox.tsalesforceconnection_0_1.tSalesforceConnection.runJobInTOS(tSalesforceConnection.java:794)
	at sandbox.tsalesforceconnection_0_1.tSalesforceConnection.main(tSalesforceConnection.java:643)
[statistics] disconnected

指定したJKSに「salesforce」なんて証明書はないよ!と言われています。

残念ながら今回はここまでなのですが、原因がわかり次第また記事を書きたいと思います。

まとめ

以上、「tSalesforceConnection」コンポーネント(OAuth接続)の紹介(未完)でした。

「Json Web Token Flow」で接続しようとされている方の何かの役に立てば幸いです。

それでは。