Sie befinden sich hier:
OAuth 2.0-JWT-Bearer-Flow für die Integration zwischen zwei Servern
In einigen Fällen möchten Sie möglicherweise Server für den Datenzugriff autorisieren, ohne sich jedes Mal interaktiv anmelden zu müssen, wenn die Server Informationen austauschen. In diesen Fällen können Sie den OAuth 2.0-JWT-Bearer-Flow (JSON-Webtoken) verwenden. Dieser Flow nutzt ein Zertifikat, um die JWT-Anforderung zu signieren, und es ist keine explizite Benutzerinteraktion erforderlich. Für diesen Flow ist jedoch eine vorherige Genehmigung der Clientanwendung erforderlich.
Erforderliche Editionen
| Verfügbarkeit: Salesforce Classic und Lightning Experience |
| Verfügbarkeit: Alle Editionen |
Mit dem OAuth 2.0-JWT-Bearer-Token-Flow postet der Client ein JWT an den Salesforce-OAuth-Token-Endpunkt. Salesforce verarbeitet das JSON-Webtoken, das eine digitale Signatur enthält, und stellt basierend auf einer vorangegangenen Genehmigung der Anwendung ein Zugriffstoken aus.
In diesem Beispiel werden die im Flow durchgeführten Schritte gezeigt.
- Ein Berichtsservice startet seinen nächtlichen Batch-Bericht.
- Die verbundene Anwendung sendet das JWT an den Salesforce-Token-Endpunkt. Das JWT ermöglicht es, dass Identitäts- und Sicherheitsinformationen sicherheitsdomänenübergreifend freigegeben werden.
- Salesforce überprüft das JWT anhand einer Signatur, eines vorab konfigurierten Zertifikats und zusätzlicher Parameter.
- Vorausgesetzt, das JWT ist gültig und die verbundene Anwendung wurde zuvor genehmigt, stellt Salesforce ein Zugriffstoken aus. Die vorherige Genehmigung erfolgt auf eine dieser beiden Arten:
- Wenn Ihre Richtlinie für die verbundene Anwendung auf Vom Administrator genehmigte Benutzer sind vorab autorisiert festgelegt ist, können Sie Profile und Berechtigungssätze verwenden.
- Wenn Ihre Richtlinie für die verbundene Anwendung auf Alle Benutzer können sich selbst autorisieren festgelegt ist, können Sie die Endbenutzergenehmigung und die Ausstellung eines Aktualisierungstokens verwenden. Der Client benötigt jedoch kein aktuelles oder gespeichertes Aktualisierungstoken. Der Client muss auch kein Client-Geheimnis an einen Token-Endpunkt übergeben.
Hinweis Bei beiden Optionen stellt Salesforce nur dann ein neues Zugriffstoken aus, wenn das ursprüngliche Zugriffstoken mindestens einen anderen Standardgeltungsbereich als den Geltungsbereichrefresh_tokenenthält. - Die verbundene Anwendung verwendet das Zugriffstoken für den Zugriff auf die geschützten Daten auf dem Salesforce-Server.
- Der Berichtsservice ruft die autorisierten Daten in seinem nächtlichen Bericht ab.
Gehen wir nun die einzelnen Schritte dieses Autorisierungs-Flows durch.
Erstellen eines JWTs
In Salesforce muss ein JWT mit RSA SHA256 signiert werden, wobei ein hochgeladenes Zertifikat als Signiergeheimnis verwendet wird. Bevor Sie diesen Autorisierungs-Flow verwenden, stellen Sie sicher, dass Sie diese Schritte ausführen.
- Laden Sie ein X509-Zertifikat in einen Java Key Store (JKS) hoch. Das Zertifikat darf nicht größer als 4 KB sein. Wenn es größer ist, versuchen Sie, eine DER-codierte Datei zu verwenden, um die Größe zu reduzieren.
- Registrieren Sie das X509-Zertifikat für die verbundene Anwendung. Das Zertifikat stimmt mit dem privaten Schlüssel der Anwendung überein. Beim Speichern der verbundenen Anwendung werden
client_idundclient_secretgeneriert und der Anwendung zugewiesen. - Erstellen Sie eine Anwendung, die ein JWT generiert, das mit dem privaten Schlüssel des X509-Zertifikats signiert ist. Die zugeordnete verbundene Anwendung verwendet das Zertifikat zum Überprüfen der Signatur. Das JWT muss mit den in https://tools.ietf.org/html/rfc7519 angegebenen allgemeinen Formatregeln konform sein.
Hinweis In Salesforce sind keine JWT-ID (JTI)-Ansprüche in JWT-Bearer-Token erforderlich. Wenn Sie jedoch einen JTI-Anspruch in Ihrem JWT-Bearer-Token übergeben, stellt Salesforce sicher, dass der JTI-Anspruch zuvor noch nicht gesendet wurde. Dadurch werden JWT-Replay-Angriffe verhindert.
Führen Sie zum Erstellen eines gültigen JWT die folgenden Schritte aus.
- Erstellen Sie eine JWT-Kopfzeile im folgenden Format:
{"alg":"RS256"}hinzu. - Nehmen Sie eine base64url-Codierung der JWT-Kopfzeile vor, wie in http://tools.ietf.org/html/rfc4648#page-7 definiert. Das Ergebnis sieht in etwa wie
eyJhbGciOiJSUzI1NiJ9aus. - Erstellen Sie ein JSON-Claims-Set für das JWT mit den folgenden Parametern.
Hier ein Beispiel für ein JSON-Claim-Set für das JWT.Parameter Beschreibung issDer Aussteller muss die OAuth- client_idder verbundenen Anwendung enthalten, für die Sie das Zertifikat registriert haben.audDie Zielgruppe identifiziert den Autorisierungsserver als entsprechende Zielgruppe. Der Autorisierungsserver muss überprüfen, ob es sich um eine für das Token vorgesehene Zielgruppe handelt.
Verwenden Sie den URL des Autorisierungsservers als Zielgruppenwert: https://login.salesforce.com, https://test.salesforce.com oder https://site.force.com/customers im Falle einer Implementierung für eine Experience Cloud-Site.
subWenn Sie diesen Flow für eine Experience Cloud-Site implementieren, muss das Subjekt den Benutzernamen des Benutzers enthalten.
Aus Abwärtskompatibilitätsgründen können Sie anstelle des Subjekts (
prn) den Prinzipal (sub) verwenden. Werden beide angegeben, wirdprnverwendet.expDer Zeitpunkt (Datum und Uhrzeit), zu dem das Token abläuft, ausgedrückt in UTC als Anzahl der Sekunden ab 1970-01-01T0:0:0Z. Salesforce lässt einen Zeitversatz von 3 Minuten zu. Wenn die Ablaufzeit beispielsweise auf 1,735,743,600 Sekunden oder den 1. Januar 2025 15:00:00 UTC festgelegt ist, ist das Token noch bis15:03:00 UTC an diesem Datum gültig. {"iss": "3MVG99OxTyEMCQ3gNp2PjkqeZKxnmAiG1xV4oHh9AKL_rSK.BoSVPGZHQ ukXnVjzRgSuQqGn75NL7yfkQcyy7", "sub": "my@email.com", "aud": "https://login.salesforce.com", "exp": "1333685628"} - Codieren Sie das JWT-Claims-Set mit base64url ohne Zeilenumbrüche. Beispiel:
eyJpc3MiOiAiM01WRzk5T3hUeUVNQ1EzZ05wMlBqa3FlWkt4bm1BaUcxeFY0b0hoOUFLTF9yU0su Qm9TVlBHWkhRdWtYblZqelJnU3VRcUduNzVOTDd5ZmtRY3l5NyIsICJwcm4iOiAibXlAZW1haWwu Y29tIiwgImF1ZCI6ICJodHRwczovL2xvZ2luLnNhbGVzZm9yY2UuY29tIiwgImV4cCI6ICIxMzMz Njg1NjI4In0= - Erstellen Sie für den codierten JWT-Header und das codierte JWT-Claims-Set eine Zeichenfolge im nachfolgenden Format.
In diesem Beispiel ist der codierte JWT-Header hervorgehoben.encoded_JWT_Header + "." + encoded_JWT_Claims_SeteyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiAiM01WRzk5T3hUeUVNQ1EzZ05wMlBqa3FlWkt4bm1BaUcxeFY0b0hoOUFLTF9yU0su Qm9TVlBHWkhRdWtYblZqelJnU3VRcUduNzVOTDd5ZmtRY3l5NyIsICJwcm4iOiAibXlAZW1haWwu Y29tIiwgImF1ZCI6ICJodHRwczovL2xvZ2luLnNhbGVzZm9yY2UuY29tIiwgImV4cCI6ICIxMzMz Njg1NjI4In0= - Laden Sie das X509-Zertifikat aus dem JKS herunter.
- Signieren Sie die sich daraus ergebende Zeichenfolge unter Verwendung von RSA SHA256.
- Erstellen Sie auf der Grundlage dieses Formats eine neue Zeichenfolge der Zeichenfolge aus diesem Schritt.
In diesem Beispiel ist die base64-codierte Signatur hervorgehoben.existing_string + "." + base64_encoded_signatureeyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiAiM01WRzk5T3hUeUVNQ1EzZ05wMlBqa3FlWkt4bm1BaUcxeFY0b0hoOUFLTF9yU0su Qm9TVlBHWkhRdWtYblZqelJnU3VRcUduNzVOTDd5ZmtRY3l5NyIsICJwcm4iOiAibXlAZW1haWwu Y29tIiwgImF1ZCI6ICJodHRwczovL2xvZ2luLnNhbGVzZm9yY2UuY29tIiwgImV4cCI6ICIxMzMz Njg1NjI4In0=.iYCthqWCQucwi35yFs-nWNgpF5NA_a46fXDTNIY8ACko6BaEtQ9E6h4Hn1l_pcwcK I_GlmfUO2dJDg1A610t09TeoPagJsZDm_H83bsoZUoI8LpAA1s-2aj_Wbysqb1j4uDToz 480WtEbkwIv09sIeS_-QuWak2RXOl1Krnf72mpVGS4WWSULodgNzlKHHyjAMAHiBHIDNt 36y2L2Bh7M8TNWiKa_BNM6s1FNKDAwHEWQrNtAeReXgRy0MZgQY2rZtqT2FcDyjY3JVQb En_CSjH2WV7ZlUwsKHqGfI7hzeEvVdfOjH9NuaJozxvhPF489IgW6cntPuT2V647JWi7ng
Dieser Java-Code ist ein einfaches Beispiel für die Erstellung eines JWT-Bearer-Tokens.
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}\", \"jti\": \"{4}\"'}'";
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] = "3MVG99OxTyEMCQ3gNp2PjkqeZKxnmAiG1xV4oHh9AKL_rSK.BoSVPGZHQukXnVjzRgSuQqGn75NL7yfkQcyy7";
claimArray[1] = "my@email.com";
claimArray[2] = "https://login.salesforce.com";
claimArray[3] = Long.toString( ( System.currentTimeMillis()/1000 ) + 300);
claimArray[4]=<JTI>
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("./path/to/keystore.jks"), "keystorepassword".toCharArray());
PrivateKey privateKey = (PrivateKey) keystore.getKey("certalias", "privatekeypassword".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();
}
}
}Anfordern eines Zugriffstokens
Zum Anfordern eines Zugriffstokens postet die verbundene Anwendung eine Tokenanforderung an den Token-Endpunkt der Salesforce-Instanz. Die Post-Anforderung enthält das JWT.
In diesem Beispiel ist eine Beispiel-Tokenanforderung dargestellt.
POST /services/oauth2/token HTTP/1.1
Host: login.example.com
Content-Type: application/x-www-form-urlencoded
grant_type= urn:ietf:params:oauth:grant-type:jwt-bearer&
assertion=eyJpc3MiOiAiM01WRz...[omitted for brevity]...ZTFügen Sie diese Parameter in den Flow ein.
| Parameter | Beschreibung |
|---|---|
grant_type
|
Verwenden Sie für den Gewährungstyp die folgenden Werte: urn:ietf:params:oauth:grant-type:jwt-bearer hinzu. |
assertion
|
Die Behauptung ist der gesamte JWT-Wert. |
format
|
(Optional) Geben Sie hiermit das erwartete Rückgabeformat an. Dieser Parameter überschreibt den Anforderungskopf. Die folgenden Formate werden unterstützt.
|
Umfangsparameter
Sie können keine Geltungsbereiche in einem JWT-Bearer-Token-Flow angeben. Umfänge werden, wie in dieser Tabelle zu sehen, entsprechend der Richtlinie "Zulässige Benutzer" der verbundenen Anwendung oder den API-Zugriffssteuerungseinstellungen Ihrer Organisation ausgestellt.
| Einstellung | Ergebnis |
|---|---|
| Richtlinie für zulässige Benutzer: Alle Benutzer können sich selbst autorisieren | Bei einer erfolgreichen Autorisierung werden die mit dem Zugriffstoken zurückgegebenen Umfänge aus den Umfängen der vorigen Genehmigungen abgeleitet. |
| Richtlinie für zulässige Benutzer: Vom Administrator genehmigte Benutzer sind vorab autorisiert | Die der verbundenen Anwendung zugewiesenen Standard- und benutzerdefinierten Umfänge werden mit dem Zugriffstoken zurückgegeben. |
| API-Zugriffssteuerung: Zulassungsliste für verbundene Anwendungen in Ihrer Organisation | Die der verbundenen Anwendung zugewiesenen Standard- und benutzerdefinierten Umfänge werden mit dem Zugriffstoken zurückgegeben. Wenn Sie verbundene Anwendungen in Ihrer Organisation zulassen, aber nicht die erwarteten Umfänge erhalten, gehen Sie wie folgt vor:
|
Salesforce gewährt Zugriffstoken
Die Flow-Anforderungen der OAuth 2.0-JWT-Bearer und SAML-Behauptungs-Bearer durchsuchen alle vorherigen Genehmigungen auf den Benutzer mit einem Aktualisierungstoken. Wenn Salesforce übereinstimmende Genehmigungen findet, werden die Werte der genehmigten Umfänge kombiniert. Anschließend stellt Salesforce ein Zugriffstoken aus. Wenn Salesforce keine früheren Genehmigungen findet, in denen ein Aktualisierungstoken oder verfügbare genehmigte Umfänge enthalten sind, schlägt die Anforderung als nicht autorisiert fehl.
Nach einer erfolgreichen Überprüfung sendet die Salesforce-Instanz eine Antwort an die verbundene Anwendung. Eine Token-Antwort für den OAuth 2.0-Flow für JWT-Bearer-Token weist dasselbe Format auf wie ein Autorisierungscode-Flow, obwohl niemals ein Aktualisierungstoken ausgegeben wird.
Dieses Beispiel zeigt eine Antwort von Salesforce.
{"access_token":"00Dxx0000001gPL!AR8AQJXg5oj8jXSgxJfA0lBog.
39AsX.LVpxezPwuX5VAIrrbbHMuol7GQxnMeYMN7cj8EoWr78nt1u44zU31
IbYNNJguseu",
"scope":"web openid api id","instance_url":"
https://yourInstance.salesforce.com","id":"
https://yourInstance.salesforce.com
/id/00Dxx0000001gPLEAY/005xx000001SwiUAAS","token_type":"Bearer"}Der Text der Antwort enthält diese Parameter.
| Parameter | Beschreibung |
|---|---|
access_token |
OAuth-Token, das von einer verbundenen Anwendung verwendet wird, um im Auftrag der Client-Anwendung den Zugriff auf eine geschützte Ressource anzufordern. Zusätzliche Berechtigungen in Form von Geltungsbereichen können mit dem Zugriffstoken einhergehen. |
token_type |
Ein Bearer-Tokentyp, der für alle Antworten verwendet wird, die ein Zugriffstoken enthalten. |
scope |
Umfänge werden entsprechend der Richtlinie "Zulässige Benutzer" der verbundenen Anwendung oder den API-Zugriffssteuerungseinstellungen Ihrer Organisation ausgestellt. Entsprechende Informationen finden Sie unter Umfangsparameter. |
instance_url |
Ein URL, der die Instanz der Organisation des Benutzers angibt. Beispiel: https://yourInstance.salesforce.com/. |
id |
Identitäts-URL, der zur Identifizierung des Benutzers sowie zur Abfrage weiterer Informationen über den Benutzer verwendet werden kann. Entsprechende Informationen finden Sie unter Identitäts-URLs. |
sfdc_site_url |
Wenn der Benutzer Mitglied einer Experience Cloud-Site ist, wird der Site-URL angegeben. |
sfdc_site_id |
Wenn der Benutzer Mitglied einer Experience Cloud-Site ist, wird die Site-ID des Benutzers angegeben. Für Experience Cloud-Sites enthält dieser Flow den Wert "sfdc_site_id" im Token-Endpunkt. Diese Site-ID ist in Connect-REST-API-Anforderungen möglicherweise erforderlich. |
Zugreifen auf geschützte Daten
Nachdem die verbundene Anwendung das access_token empfangen hat, kann sie es als ein Bearer-Token in der Anforderung der Autorisierungskopfzeile weitergeben. Dieses Beispiel zeigt einen REST-API-Aufruf an Experience Cloud-Sites:
https://site.force.com/customers/services/data/v32.0/ -H
"Authorization: Bearer 00D50000000IehZ\!AQcAQH0dMHZfz972Szmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1E6 LYUfiDUkWe6H34r1AAwOR8B8fLEz6n04NPGRrq0FM"
