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

学習の目的

この単元を完了すると、次のことができるようになります。
  • 接続アプリケーションの目的を説明する。
  • X.509 証明書と鍵の生成に使用するコマンドを挙げる。

Salesforce CLI で CI を促進する方法

Salesforce CLI を使用すると、自動化を促進するスクリプトの作成をはじめ、アプリケーションの開発ライフサイクル全体をコマンドラインから簡単に管理できます。けれども、CI やビルドの自動化ジョブが実行されるときに、開発者自らがその場でログインするわけではないため、認証プロセスを管理する手段が必要になります。そこで、Salesforce CLI でサポートされている OAuth JSON Web トークン (JWT) ベアラーフローを使用します。

CI ソリューションを機能させるためには、JWT ベアラートークンペイロードを署名するための非公開鍵を生成して、その非公開鍵から生成された証明書を保有する Dev Hub 組織に接続アプリケーションを作成します。

JWT ベアラーフローは、アップロードされた証明書を署名の秘密として使用する RSA SHA256 アルゴリズムをサポートします。この OAuth フローでは、CLI を使用した認証が可能で、対話形式のログインが必要ありません。このヘッドレスフローは、自動化されたビルドやスクリプトの作成に最適です。(ヘッドレスプロセスとは、ユーザインターフェースなしで実行するプロセスのことです。開発者が頭 (ヘッド) を枕にうずめて休んでいる間に、CI システムが代わりに Salesforce CLI を使用して働いてくれます)。この便利な CLI コマンドについては、必要となる X.509 証明書と鍵を生成した後でご紹介します。

OpenSSL の実装の確認

OpenSSL ライブラリを使用して、独自の証明書を生成します。このステップで作成されたファイルには、他人がシステム侵害に悪用する可能性がある機密情報が含まれます。そのため、この情報を後から使用できるように安全な場所に保管しておいてください。これらのファイルを見つけやすいように、プロジェクトフォルダ外のファイルシステムにフォルダを作成します。

  1. プロジェクトフォルダの外部に certificates フォルダを作成します。
    cd ..
    mkdir certificates
  2. ローカル環境で次のコマンドを実行し、OpenSSL がすでにインストールされているかどうかを確認します。
    which openssl
    このコマンドで、次のようなパスが返されましたか? /usr/bin/openssl
  3. which openssl コマンドでパスが返されない場合は、OpenSSL をインストールします。
    次を使用している場合...
    次をインストール.....
    macOS
    Homebrew: brew install openssl
    Windows
    Windows 完全 package.exe インストローラ
    Ubuntu Linux
    apt-get install openssl

自己署名 SSL 証明書および非公開鍵の作成

SSL 証明書を作成するためには、非公開鍵と証明書署名要求が必要です。これらのファイルは、いくつかのシンプルなコマンドで生成できます。

メモ

メモ

セキュリティ上の理由により、これらのコマンドは Git リポジトリディレクトリの外部で実行します。Certificates フォルダを作成してもらったのもこのためです。これらのファイルをリポジトリにうっかりコミットされても困るからです。

  1. ディレクトリを certificates フォルダに変更します。
    cd certificates
  2. certificates フォルダ内から、RSA 非公開鍵を生成します。
    openssl genrsa -des3 -passout pass:SomePassword -out server.pass.key 2048
  3. server.pass.key ファイルから鍵ファイルを作成します。
    openssl rsa -passin pass:SomePassword -in server.pass.key -out server.key
  4. server.pass.key を削除します。
    rm server.pass.key
  5. 証明書を要求して生成します。
    openssl req -new -key server.key -out server.csr
  6. 必要な情報をすべて入力します。
    1. 確認用のパスワードの入力を促されたら Enter キーを押します。入力を促され認証機関は、証明書を取り消そうとするときにこのパスワードを使用して証明書の所有者を認証します。これは自己署名証明書であるため、CRL (証明書取り消しリスト) を使用して取り消すことはできません。
    2. 省略可能な会社名の入力を省く場合は、ピリオド (.) を入力します。
  7. SSL 証明書を生成します。
    openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
    server.key 非公開鍵と server.csr ファイルを基に自己署名 SSL 証明書が生成されます。certificates フォルダの中身を確認します。
    -rw-r--r-- 1 1322 May 3 14:03 server.crt
    -rw-r--r-- 1 1066 May 3 14:03 server.csr
    -rw-r--r-- 1 1675 May 3 14:02 server.key
    server.crt ファイルはサイトの証明書で、server.key 非公開鍵と一緒に接続アプリケーションで使用するのに適しています。これらのファイルはこの後すぐに使用します。いずれも守秘すべき秘密であるため、差し当たって安全な場所に保管しておいてください。

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

この次のステップでは、先ほど作成した証明書を保有する接続アプリケーションを作成します。接続アプリケーションは、API を使用して、アプリケーションを Salesforce と統合します。このモジュールでは基本的に、接続アプリケーションを介して Dev Hub に接続し、Salesforce CLI コマンドを実行するヘッドレスプロセスが可能になります。

Dev Hub へのログイン

  1. sfdx-travisci フォルダに戻ります。
    cd ..
  2. Dev Hub 組織を開きます。
    • Dev Hub をすでに認証している場合は、次のコマンドで開きます。
      sfdx force:org:open -u DevHub
    • Dev Hub 組織にまだログインしていない場合はログインします。
      sfdx auth:web:login -d -a DevHub
      -D フラグを追加すると、この組織がデフォルトの Dev Hub として設定されます。組織に別名を設定する場合は、-a フラグを使用して引数 (DevHub などわかりやすいもの) を設定します。組織に割り当てられたわかりにくい一意のユーザ名よりも、別名のほうがはるかに簡単に覚えることができます。
  3. 組織をリストします。
    sfdx force:org:list
    リストコマンドの出力は次のようになります。このコマンドによって、Dev Hub に接続されているかどうか、およびこの Dev Hub 組織がデフォルトかどうかがどのように判断されたかに注意します。
    === Orgs
        ALIAS   USERNAME          ORG ID              CONNECTED STATUS
    ─── ─────── ────────────────  ──────────────────  ──────────────────
    (D) DevHub  user@dh0425.org   00DB0000000Ifd5MAC  Connected

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

  1. [設定] から、[クイック検索] ボックスに「アプリケーションマネージャ」と入力し、[アプリケーションマネージャ] を選択します。
  2. [新規接続アプリケーション] をクリックします。
  3. 接続アプリケーション名と自身のメールアドレスを入力します。
    1. 接続アプリケーション名: sfdx travis ci
    2. 連絡先メール: <自身のメールアドレス>
  4. [OAuth 設定の有効化] をオンにします。
  5. コールバック URL を入力します。
    http://localhost:1717/OauthRedirect
  6. [デジタル署名を使用] をオンにします。
  7. server.crt ファイルをアップロードするには、[ファイルを選択] をクリックします。
  8. OAuth 範囲には、次の項目を追加します。
    • データへのアクセスと管理 (api)
    • ユーザに代わっていつでも要求を実行 (refresh_token、offline_access)
    • Web 経由のデータへのアクセスを提供 (web)
  9. [新規接続アプリケーション] 設定ページ
  10. [保存] をクリックします。 

 

メモ

メモ

コンシューマ鍵は後で使用するため忘れずにコピーしておきます。 

ポリシーの編集

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

  1. [管理] をクリックします。
  2. [ポリシーを編集] をクリックします。
  3. [OAuth ポリシー] セクションの [許可されているユーザ] で、[管理者が承認したユーザは事前承認済み] を選択して、[OK] をクリックします。
  4. [保存] をクリックします。

権限セットを作成する

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

  1. [設定] から、[クイック検索] ボックスに「権限」と入力し、[権限セット] を選択します。
  2. [新規] をクリックします。
  3. [表示ラベル] に「sfdx travis ci」と入力します。
  4. [保存] をクリックします。
  5. [sfdx travis ci] | [割り当ての管理] | [割り当てを追加] をクリックします。
  6. Dev Hub ユーザ名の横にあるチェックボックスをオンにして、[割り当て] | [完了] をクリックします。
  7. 接続アプリケーションに戻ります。
    1. [設定] から、[クイック検索] ボックスに「アプリケーションマネージャ」と入力し、[アプリケーションマネージャ] を選択します。
    2. sfdx travis ci の横にあるリスト項目ドロップダウン矢印 (リスト項目ドロップダウン) をクリックして、[管理] をクリックします。
    3. [権限セット] セクションで、[権限セットの管理] をクリックします。
    4. [sfdx travis ci] の横にあるチェックボックスをオンにして、[保存] をクリックします。

JWT 認証フローのテスト

JWT 認証フローのテストでは、以前に保存しておくよう指示したいくつかの情報を使用します。ここでは、接続アプリケーションを作成したときに生成されたコンシューマ鍵 (CONSUMER_KEY)、OpenSSL の server.key ファイルを生成した場所への絶対パス (JWT_KEY_FILE)、Dev Hub のユーザ名 (HUB_USERNAME) を使用します。

コマンドラインで、次の 3 つのセッションベースの環境変数を作成します。

export CONSUMER_KEY=<connected app consumer key>
export JWT_KEY_FILE=<example: /users/yourname/certificates/server.key>
export HUB_USERNAME=<your Dev Hub username>
Windows のコマンドライン:
set CONSUMER_KEY=<connected app consumer key>
set JWT_KEY_FILE=<example: /users/yourname/certificates/server.key>
set HUB_USERNAME=<your Dev Hub username>

JWT 鍵ファイルへのファイルパス。これらの環境変数によって JWT の auth コマンドの実行が促進されます。

次のコマンドをこのまま 1 行で入力します。
sfdx auth:jwt:grant --clientid ${CONSUMER_KEY} --username ${HUB_USERNAME} \
--jwtkeyfile ${JWT_KEY_FILE} --setdefaultdevhubusername

Windows の場合は、次のコマンドもこのまま 1 行で入力します。

sfdx auth:jwt:grant --clientid %CONSUMER_KEY% --username %HUB_USERNAME% --jwtkeyfile %JWT_KEY_FILE% --setdefaultdevhubusername

このコマンドは、コンシューマ鍵 (クライアント ID)、ユーザ名、JWT 鍵ファイルのみを使用して Dev Hub にログインします。この一番の特長は、対話形式のログインが必要ないことです。スクリプトを自動的に実行したい場合はこの点が重要です。

おめでとうございます。接続アプリケーションを作成できました!

メモ