本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
為銷售力量設置 JWT 承載 OAuth 流程
如需啟用與 OAuth 2.0 JSON 網頁
建立PEM檔案的證書/金key pair
建立PEM檔案的證書/金key pair
openssl req -newkey rsa:4096 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
使用 JWT 建立與 Salesforce 連線的應用程式
登入 Salesforce
並按一下右上角的設定齒輪,然後選取 [設定]。 在左側,導覽至 [應用程式管理員]。(平台工具 > 應用程式 > 應用程式管理員)
選擇新增連線應用程式。
提供一個應用程序名稱,讓其餘的 auto 填充。
勾選「啟用 OAuth 設定」方塊。
設定回呼網址。它不會用於 JWT,因此您可以使用 https://localhost。
勾選「使用數位簽名」方塊。
上傳先前建立的憑證 .pem 檔案。
新增必要的權限:
透過 API 管理使用者資料。
存取自訂權限 (自訂權限)。
存取身分識別 URL 服務 (ID、設定檔、電子郵件、地址、電話)。
訪問唯一的用戶標識符(OpenID)。
隨時執行請求(刷新令牌,離線訪問)。
核取 [為指名使用者發行 JSON Web Token (JWT) 存取權杖] 核取方塊。
選擇儲存。
選擇繼續。
選擇管理消費者詳細資訊。
複製消費者金鑰 (用戶端 ID)。
複製消費者密碼 (用戶端密碼)。
按一下 Cancel (取消)。
生成一個 JSON 網絡令牌(JWT)
將 key pair 轉換為 pkcs12 (出現提示時設定匯出密碼)。
openssl pkcs12 -export -in cert.pem -inkey key.pem -name jwtcert > jwtcert.p12
從 pkcs12 建立 Java 金鑰儲存庫 (在出現提示時設定目標金鑰庫密碼,並提供原始碼儲存庫密碼之前的匯出密碼)。
keytool -importkeystore -srckeystore jwtcert.p12 -destkeystore keystore.jks -srcstoretype pkcs12 -alias jwtcert
確認密鑰庫 .jks 包含 jwtcert 別名(出現提示時輸入先前的目標密鑰庫密碼)。
keytool -keystore keystore.jks -list
使用 Salesforce 文件中提供的 Java 類別 JWT 範例來產生已簽署的權杖。
視需要編輯磁面馬拉線中的值:
克萊馬雷 [0] = 用戶端識別碼
克萊馬雷 [1] = 銷售人員使用者識別碼
克萊馬雷 [2] = 銷售人員登錄網址
克萊馬雷 [4] = 自紀元以來的到期日,以毫米為單位。3660624000000 是 2085-12-31。
將路徑/到密鑰庫替換為密鑰庫 .jks 的正確路徑。
將密鑰庫密碼替換為您輸入的目標密鑰庫密碼
用您輸入的源密鑰庫密碼替換私密密鑰密碼
編譯程式碼。該代碼取決於用於 base64 編碼的 Apache 共享編解
碼器。 javac -classpath ".:./commons-codec-1.16.1.jar" JWTExample.java
執行程式碼。
java -classpath ".:commons-codec-1.16.1.jar" JWTExample
創建連接的應用程序和 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(); } } }