[Talend]tSalesforceConnectionを利用してSalesforceに接続しようとしてみた(OAuth接続)
はじめに
こんにちは。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のアカウントが無い場合には、以下から開発者環境を無料で新規作成することができます。
tSalesforceConnectionについて
「tSalesforceConnection」を利用すると、Salesforceに接続をすることができ、その後の「tSalesforceInput」、「tSalesforceInput」コンポーネントなどでコネクションを利用することができます。
「tSalesforceConnection」コンポーネントのTalend Helpページはこちらです。
では、具体的に以下で解説していきます。
ジョブの説明
今回は「tSalesforceConnection」で接続確認をするだけとなっており、コンポーネントを置いただけとなります。なお、左側がBasic接続、右側がOAuth接続をする設定にしたコンポーネントです。
Salesforceでの下準備
OAuth接続をするにはSalesforce側で下準備が必要です。
tSalesforceConnectionでOAuth接続を選択した場合、認証フローとして「Json Web Token Flow」が選択できます。(認証フローの詳細は以下のSalesforceのヘルプに記載されています)
この認証フローを利用するにあたり、「自己証明書」の作成と「接続アプリケーション」の設定が必要となります。
「自己証明書」の作成は、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」で接続しようとされている方の何かの役に立てば幸いです。
それでは。