[Salesforce DX]Salesforce CLIを使ってJWTべアラートークンフローを試してみる

salesforce

どうも!西村祐二@大阪です。

Salesforce DXでは開発の際に継続的統合および継続的デリバリー(CI/CD)
行いやすくすることを目的の一つとして開発されています。
CI/CDを行うためにはSalesforce環境にブラウザを介さずに自動でログインする必要があります。
今回、Salesforce CLIでサポートされている「JWT べアラートークンフロー」を
利用してログインしてみようと思います。

これは開発におけるCI/CD以外にもスクリプトを使って
Salesforce環境から情報を抽出する際や、
逆にSalesforceに情報を挿入・更新する際にも役立つと思います。

JWT ベアラートークンフローとは

公式ドキュメントに詳しく記載されております

簡単にいうとJWTを利用して自動でログイン認証する方法です。

JWTについては下記ページが大変参考になります。

JWTによるJSONに対する電子署名と、そのユースケース

やってみる

今回、JWT ベアラートークンフローを利用してCLIからブラウザを介さずにログインしてみようと思います。

事前準備

opensslコマンドを利用できるようにしておきましょう。

環境

Mac : macOS Sierra 10.12.5
openssl : OpenSSL 0.9.8zh 14 Jan 2016
Salesfoce CLI : sfdx-cli/5.7.6-d42cf65 (darwin-amd64) go1.7.3 sfdxstable
Salesforce DX : v40.0

自己署名付きSSL証明書と秘密鍵を作成

セキュリティの観点より下記コマンドはGitレポジトリの外で実行し 作成されたファイルの管理には十分注意してください。

▼ディレクトリを作成し移動します。

$ mkdir certificates && cd certificates

▼RSA秘密鍵を生成します。

$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048

Generating RSA private key, 2048 bit long modulus
................+++
..........................+++

▼server.pass.key ファイルから暗号化を解きRSAキーファイルを作成します。

$ openssl rsa -passin pass:x -in server.pass.key -out server.key

writing RSA key

▼server.pass.keyを削除しておきます。

$ rm server.pass.key

▼証明書をリクエストして生成します。
国名などきかれますので情報を入力してください。
オレオレなのでダミー情報を入力してもcsrは生成されます。

$ openssl req -new -key server.key -out server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

▼SSL証明書を生成します。

自己署名入りSSL証明書は、秘密鍵とcsrファイルから生成されます。

$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

Signature ok
・
・
・
Getting Private key

▼確認

server.crtファイルはserver.keyの秘密鍵と一緒に接続するアプリでの使用に適した証明書です。

$ ls
server.crt server.csr server.key

CLIに登録

CLIからログインするためにSalesforce環境を登録しておきます。

すでに登録済であれば下記コマンドよりログインしてください。

sfdx force:org:open -u <alias name>

未登録の場合は下記コマンド入力後にブラウザが立ち上がるので
登録したいSalesforce環境にログインすると
Alias名とSalesforce環境が紐付けされます。

$ sfdx force:auth:web:login -a <alias name>

SandBoxのときは-rオプションをつけてログインURLを指定する必要があります。

$ sfdx force:auth:web:login -r https://test.salesforce.com -a <alias name>

接続用アプリケーションを作成

下記はLightning Experienceでの実施を想定しています。Classic版だと表記が異なる場合があるのでご注意ください。

  • 「クイック検索」から検索し、「アプリケーションマネージャ」を選択します。
  • 新規接続アプリケーションをクリックします。
  • 接続アプリケーション名: sfdx test
  • API参照名:sfdx_test
  • 取引先責任者メール: your email address
  • 「OAuth設定を有効化」にチェックします。
  • コールバックURL : http://localhost:1717/OauthRedirect
  • ※コールバックURLは利用しませんが、設定が必須なのでTrailheadに記載の値を入力しておきます。
  • 「デジタル署名を使用」にチェックします。
  • 「ファイルを選択」をクリックし、作成したserver.crtファイルをアップロードする。
  • 利用可能なOAuthの範囲は、以下を追加します。
  • ・データへのアクセスと管理(api)
  • ・ユーザに代わっていつでも要求を実行(refresh_token、offline_access)
  • ・Web経由でデータへのアクセスを提供(web)
  • 最後に保存する

作成が完了したらコンシューマ鍵をメモしておいてください。

ポリシーの設定

接続用アプリケーションを保存した後、ポリシーを編集して手動ログインプロセスを回避できるようにします。

  • アプリケーションの「Manage」をクリックします。
  • 「ポリシーを編集」をクリックします。
  • 「OAuthポリシー」セクションで「許可されているユーザー」が、「管理者が承認したユーザーは事前承認済み」であることを確認する。
  • 違うければ変更し「保存」をクリックします。

権限セットの設定

最後に、権限セットを作成し、この接続用アプリケーションに事前承認されたユーザーを割り当てます。

  • 「クイック検索」から検索し「権限セット」を選択します。
  • 新規をクリックします。
  • ラベルには、次のように入力します。 sfdx test
  • 「保存」をクリックします。
  • 作成した権限セット「sfdx test」をクリックします。
  • 「割り当てられた接続アプリケーション」をクリックします。
  • 編集ボタンをクリックし、対象の接続用アプリケーション「sfdx test」を「接続アプリケーションを有効化」に追加します。
  • 「保存」をクリックします。
  • 権限セットの画面に戻ります。
  • sfdx testをクリックします。
  • 「割り当ての管理」をクリックし、「割り当てを追加」をクリックします。
  • ログインユーザ名の横にあるチェックボックスを選択します。
  • 「完了」をクリックします。

JWT認証フローテスト

JWTべアラートークンフローの設定完了したのでCLIから接続確認してみます。

$ export CONSUMER_KEY=<connected app consumer key>
$ export JWT_KEY_FILE=<your server.key path>
$ export HUB_USERNAME=<your Dev Hub username>

$ sfdx force:auth:jwt:grant -i ${CONSUMER_KEY} -u ${HUB_USERNAME} -f ${JWT_KEY_FILE} -a jwt
Successfully authorized xxxxxxxxxxx@yyyyyyyyy.jp with org id 00XXXXXXXXXXXXXX

上記のログがでたら成功です。

さいごに

いかがだったでしょうか。
CI/CDをする際に必要となるブラウザを介さずにSalesforce環境へ
ログインする方法をJWTべアラートークンフローで試してみました。

誰かの参考になれば幸いです。

AWS Cloud Roadshow 2017 福岡