為銷售力量設置 JWT 承載 OAuth 流程 - AWS Glue

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為銷售力量設置 JWT 承載 OAuth 流程

如需啟用與 OAuth 2.0 JSON 網頁權杖的 server-to-server 整合,請參閱 Salesforce 公開文件。

建立PEM檔案的證書/金key pair

建立PEM檔案的證書/金key pair

openssl req -newkey rsa:4096 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

使用 JWT 建立與 Salesforce 連線的應用程式

  1. 登入 Salesforce 並按一下右上角的設定齒輪,然後選取 [定]。

  2. 在左側,導覽至 [應用程式管理員]。(平台工具 > 應用程式 > 應用程式管理員)

  3. 選擇新增連線應用程式

  4. 提供一個應用程序名稱,讓其餘的 auto 填充。

  5. 勾選「啟用 OAuth 設定」方塊。

  6. 設定回呼網址。它不會用於 JWT,因此您可以使用 https://localhost。

  7. 勾選「使用數位簽名」方塊。

  8. 上傳先前建立的憑證 .pem 檔案。

  9. 新增必要的權限:

    1. 透過 API 管理使用者資料。

    2. 存取自訂權限 (自訂權限)。

    3. 存取身分識別 URL 服務 (ID、設定檔、電子郵件、地址、電話)。

    4. 訪問唯一的用戶標識符(OpenID)。

    5. 隨時執行請求(刷新令牌,離線訪問)。

  10. 核取 [為指名使用者發行 JSON Web Token (JWT) 存取權杖] 核取方塊。

  11. 選擇儲存

  12. 選擇繼續

  13. 選擇管理消費者詳細資訊

  14. 複製消費者金鑰 (用戶端 ID)。

  15. 複製消費者密碼 (用戶端密碼)。

  16. 按一下 Cancel (取消)

生成一個 JSON 網絡令牌(JWT)

  1. 將 key pair 轉換為 pkcs12 (出現提示時設定匯出密碼)。

    openssl pkcs12 -export -in cert.pem -inkey key.pem -name jwtcert > jwtcert.p12
  2. 從 pkcs12 建立 Java 金鑰儲存庫 (在出現提示時設定目標金鑰庫密碼,並提供原始碼儲存庫密碼之前的匯出密碼)。

    keytool -importkeystore -srckeystore jwtcert.p12 -destkeystore keystore.jks -srcstoretype pkcs12 -alias jwtcert
  3. 確認密鑰庫 .jks 包含 jwtcert 別名(出現提示時輸入先前的目標密鑰庫密碼)。

    keytool -keystore keystore.jks -list
  4. 使用 Salesforce 文件中提供的 Java 類別 JWT 範例來產生已簽署的權杖。

    1. 視需要編輯磁面馬拉線中的值:

      • 克萊馬雷 [0] = 用戶端識別碼

      • 克萊馬雷 [1] = 銷售人員使用者識別碼

      • 克萊馬雷 [2] = 銷售人員登錄網址

      • 克萊馬雷 [4] = 自紀元以來的到期日,以毫米為單位。3660624000000 是 2085-12-31。

    2. 將路徑/到密鑰庫替換為密鑰庫 .jks 的正確路徑。

    3. 將密鑰庫密碼替換為您輸入的目標密鑰庫密碼

    4. 用您輸入的源密鑰庫密碼替換私密密鑰密碼

    5. 編譯程式碼。該代碼取決於用於 base64 編碼的 Apache 共享編解碼器。

      javac -classpath ".:./commons-codec-1.16.1.jar" JWTExample.java
    6. 執行程式碼。

      java -classpath ".:commons-codec-1.16.1.jar" JWTExample
  5. 創建連接的應用程序和 JWT 後,仍然需要對該應用程序授權用戶。有關兩種方法,請參閱 https://mannharleen.github.io/2020-03-03-salesforce-jwt/ 中的步驟 3。

通過上述步驟完成後,這應該輸出一個 JSON 網絡令牌(JWT),可用於從 Salesforce 獲取訪問令牌。

示例輸入

export password for pkcs12: awsglue destination keystore password for jks: awsglue source keystore password for jks: awsglue claimArray[0] = “client-id”; claimArray[1] = “my@email.com”; claimArray[2] = "https://login.salesforce.com“; claimArray[3] = "3660624000000"; path to keystore: ./keystore.jks keystore password: awsglue privatekey password: awsglue

示例輸出

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.signature

有用的鏈接

  • https://www.base64encode.org/

  • https://jwt.io/

  • https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm

JWTExample.java:

import org.apache.commons.codec.binary.Base64; import java.io.*; import java.security.*; import java.text.MessageFormat; public class JWTExample { public static void main(String[] args) { String header = "{\"alg\":\"RS256\"}"; String claimTemplate = "'{'\"iss\": \"{0}\", \"sub\": \"{1}\", \"aud\": \"{2}\", \"exp\": \"{3}\"'}'"; try { StringBuffer token = new StringBuffer(); //Encode the JWT Header and add it to our string to sign token.append(Base64.encodeBase64URLSafeString(header.getBytes("UTF-8"))); //Separate with a period token.append("."); //Create the JWT Claims Object String[] claimArray = new String[5]; claimArray[0] = "value"; claimArray[1] = "my@email.com"; claimArray[2] = "https://login.salesforce.com"; claimArray[3] = Long.toString( ( System.currentTimeMillis()/1000 ) + 300); MessageFormat claims; claims = new MessageFormat(claimTemplate); String payload = claims.format(claimArray); //Add the encoded claims object token.append(Base64.encodeBase64URLSafeString(payload.getBytes("UTF-8"))); //Load the private key from a keystore KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(new FileInputStream("./keystore.jks"), "awsglue".toCharArray()); PrivateKey privateKey = (PrivateKey) keystore.getKey("jwtcert", "awsglue".toCharArray()); //Sign the JWT Header + "." + JWT Claims Object Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(token.toString().getBytes("UTF-8")); String signedPayload = Base64.encodeBase64URLSafeString(signature.sign()); //Separate with a period token.append("."); //Add the encoded signature token.append(signedPayload); System.out.println(token.toString()); } catch (Exception e) { e.printStackTrace(); } } }