[Salesforce DX]Salesforce CLIを使ってJWTべアラートークンフローを試してみる
どうも!西村祐二@大阪です。
Salesforce DXでは開発の際に継続的統合および継続的デリバリー(CI/CD)を
行いやすくすることを目的の一つとして開発されています。
CI/CDを行うためにはSalesforce環境にブラウザを介さずに自動でログインする必要があります。
今回、Salesforce CLIでサポートされている「JWT べアラートークンフロー」を
利用してログインしてみようと思います。
これは開発におけるCI/CD以外にもスクリプトを使って
Salesforce環境から情報を抽出する際や、
逆にSalesforceに情報を挿入・更新する際にも役立つと思います。
JWT ベアラートークンフローとは
簡単にいうとJWTを利用して自動でログイン認証する方法です。
JWTについては下記ページが大変参考になります。
やってみる
今回、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べアラートークンフローで試してみました。
誰かの参考になれば幸いです。