Loading
Identificeer uw gebruikers en beheer toegang
Headless Identity-API's: Stroom Autorisatiecode- en inloggegevens voor privéclients

Headless Identity-API's: Stroom Autorisatiecode- en inloggegevens voor privéclients

Voor privéclients, zoals client-serverapps, kunt u headless login instellen voor klanten en partners met behulp van de stroom Autorisatiecode- en inloggegevens, die is gebaseerd op het toekenningstype OAuth 2.0-autorisatiecode.

Vereiste editions

Beschikbaar in: zowel Salesforce Classic als Lightning Experience
Beschikbaar in: Enterprise, Unlimited en Developer Edition
Opmerking
Opmerking Hier verwijst externe app naar elke app buiten Salesforce.

Met de stroom Autorisatiecode- en inloggegevens bepaalt u de inlogervaring voor de front-end van een externe app. U roept Salesforce Headless Login-API's aan via uw Experience Cloud-site om het back-endwerk af te handelen. Dit bestaat uit de authenticatie van gebruikers en het verlenen van toegang tot beschermde Salesforce-resources. Gescheiden processen voor de front-end en de back-end stellen gebruikers in staat om in te loggen en toegang tot Salesforce-gegevens te krijgen zonder uw app te verlaten. Voor privéclients start u de stroom in de browser en voltooit u de codeuitwisseling met een callback-handler aan de serverzijde om de autorisatiecode te extraheren en deze uit te wisselen voor een toegangstoken.

Voltooi deze stappen voordat u deze stroom instelt.

Omdat u Salesforce Customer Identity beheert via Experience Cloud-sites, kunt u de stroom Autorisatiecode- en inloggegevens alleen configureren voor klanten en partners die een subdomein van een Experience Cloud-site zoals https://MyExperienceCloudSite.my.site.com gebruiken. U kunt deze stroom niet instellen voor werknemers die toegang tot het Salesforce-platform hebben met login.salesforce.com of uw organisatiespecifieke inlog-URL voor Mijn domein, of voor werknemers die toegang hebben tot Experience Cloud-sites.

Dit is een voorbeeld van een gebruikscase voor de stroom Autorisatiecode- en inloggegevens. U werkt voor een reisbureau dat klantgegevens opslaat in Salesforce. U hebt een aangepaste app gemaakt met een client-serverarchitectuur en u wilt dat gebruikers vanuit uw app toegang hebben tot eerdere boekingen van reizen. U wilt ook volledige controle over de inlogervaring, zodat u de branding van uw bedrijf kunt gebruiken. U configureert uw aangepaste app daarom als een externe clientapp of verbonden app en stelt de stroom Autorisatiecode- en inloggegevens in.

Standaard geven gebruikers hun gebruikersnaam op om in te loggen. Als u gebruikers meer opties wilt bieden, stelt u ontdekken van headless gebruikers in. Ontwikkel bijvoorbeeld een stroom waarin gebruikers hun e-mailadres, telefoonnummer of zelfs een ordernummer opgeven. Zie Headless inloggen zonder gebruikersnaam.

Hier volgt een vereenvoudigd overzicht van hoe de stroom werkt.

Stroomschema van de stroom Autorisatiecode- en inloggegevens voor webapps met een backingserver
  • Een gebruiker opent uw aangepaste app, waar uw inlogformulier native wordt weergegeven binnen de app, en geeft zijn of haar gebruikersnaam en wachtwoord op. Of als u ontdekking van headless gebruikers gebruikt, voeren ze een identifier in zoals een e-mailadres, telefoonnummer of ordernummer, samen met hun wachtwoord.
  • Als u de extensie Proof Key for Code Exchange (PKCE) gebruikt, genereert de app waarden om de autorisatiecode te verifiëren. Als u geen PKCE gebruikt, wordt deze stap in uw stroom overgeslagen.
  • Vanuit de browser verzendt uw aangepaste app, via JavaScript, een headless aanvraag voor een autorisatiecode naar het autorisatie-eindpunt van de Salesforce-API Headless Login op uw Experience Cloud-site.
  • Als u headless gebruikers ontdekken gebruikt, vindt uw Apex handler de gebruiker op basis van de identifier die deze heeft gebruikt om in te loggen. Als de gebruikersgegevens geldig zijn en de gebruiker een geverifieerd e-mailadres of telefoonnummer heeft, gaat het inloggen door.
  • De Salesforce-API Headless Login valideert de inloggegevens van de gebruiker en retourneert een 302-omleiding naar een vooraf geconfigureerde URL die de autorisatiecode bevat. De 302-omleiding wordt verwerkt binnen de browser en de respons wordt headless geleverd aan uw vooraf geconfigureerde callback-handler op uw server.
  • De callback-handler aan de serverzijde extraheert de autorisatiecode en andere parameters uit de respons met de 302-omleiding. Vervolgens initieert de handler de codeuitwisseling via een POST-aanvraag op de server naar het tokeneindpunt op de Experience Cloud-site.
  • Vanuit het tokeneindpunt retourneert de Salesforce-API Headless Login een respons met toegangstoken naar de callback-handler aan de serverzijde.
  • De callback-handler aan de serverzijde verwerkt de tokenrespons en retourneert de inlogstatus naar de app. Deze respons kan sessiegegevens, gebruikersinformatie en mogelijk het toegangstoken bevatten, afhankelijk van het ontwerp van uw app en de beveiligingspositie.
  • De browser ontvangt de respons dat er is ingelogd en richt de gebruikerssessie in.
  • De gebruiker is nu ingelogd en voert een actie in uw aangepaste app uit die een aanvraag van Salesforce-gegevens initieert. De gebruiker klikt bijvoorbeeld op een knop om toegang te krijgen tot zijn of haar historie van boeking van reizen, die is opgeslagen in de Salesforce Experience Cloud-site.
  • Uw aangepaste app doet een geauthenticeerde aanvraag bij een beschermd Salesforce-eindpunt, zoals een Salesforce-API.
  • De klant heeft nu toegang tot zijn of haar beschermde gegevens in uw aangepaste app. De gebruiker kan bijvoorbeeld zijn of haar historie van geboekte reizen zien.

Een belangrijke component van deze stroom is de JavaScript-code aan de clientzijde die autorisatie aanvraagt en de respons met het toegangstoken ontvangt. In dit voorbeeld wordt een verbonden app gebruikt.

var clientId = '<Connected App Client ID>';
var baseURL = '<Experience Cloud Domain>';
var redirectURL = '<Experience Cloud Domain>/services/apexrest/code/exchange';

function getUserInfo(accessToken, userInfoBaseURL) {
   var client = new XMLHttpRequest();
   client.open("GET", userInfoBaseURL + "/services/oauth2/userinfo", true);
   client.setRequestHeader("Content-Type", "application/json");
   client.setRequestHeader("Authorization", "Bearer " + accessToken);
   client.send();
   client.onreadystatechange = function() {
       if(this.readyState == 3) {
           response = JSON.parse(client.response);
           response.access_token = accessToken;
           document.getElementById("json").textContent = JSON.stringify(response, undefined, 2);
           document.getElementById("results").style.display="block";
       }
   }
}

function startLogin() {
   var username = document.getElementById('user_name').value;
   var password = document.getElementById('password').value;
   var encodedUNP = btoa(username + ':' + password);
   var client = new XMLHttpRequest();
   client.open("POST", baseURL + "/services/oauth2/authorize", true);
   client.setRequestHeader("Auth-Request-Type", "Named-User");
   client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   client.setRequestHeader("Authorization", "Basic " + encodedUNP);
   client.send("response_type=code_credentials&client_id=" + clientId + "&redirect_uri=" + redirectURL);
   client.onreadystatechange = function() {
       if(this.readyState == 3) {
           console.log("here");
           console.log(client.response);
           response = JSON.parse(client.response);
           if (response.success) {
               getUserInfo(response.access_token, baseURL);
           }
       }
   }
   return false;
}    

Een andere belangrijke component is de callback-handler aan de serverzijde, die de code extraheert en deze uitwisselt voor een toegangstoken. Dit is een voorbeeld van een callback-handler die een Apex-klasse gebruikt die zichtbaar is als een REST-resource.

@RestResource(urlMapping='/code/exchange')
global class CodeExchangeAPI {
  
   @HttpGet
   global static ExchangeResponse doGet() {
       RestRequest req = RestContext.request;
       RestResponse res = RestContext.response;
       try {
           res.statusCode = 200;
          
              String accessToken = doCodeExchange(req.params.get('code'), req.params.get('sfdc_community_url'));
           if (accessToken != null) {
                return new ExchangeResponse(accessToken, req.params.get('state'));
           } else {
               return new ExchangeResponse('Could not parse auth code redirect URI');
           }
       } catch (Exception e) {
           res.statusCode = 500;
           return new ExchangeResponse('Could not parse auth code redirect URI');
       }
      
   }
  
  
   global static String doCodeExchange(String code, String communityURL) {
       String clientId = 'Connected App Client ID';
       String redirectURL = '<Experience Cloud Domain>/services/apexrest/code/exchange';
       String clientSecret = null;
      
       Http h = new Http();
       HttpRequest req = new HttpRequest();
       req.setMethod('POST');
      
       //Create Code Exchange URL
       String url = communityURL + '/services/oauth2/token';
       req.setEndpoint(url);
      
       //Post Body
       String body = 'grant_type=authorization_code';
       body = body + '&client_id=' + clientId;
       body = body + '&code=' + code;
       if (clientSecret != null) {
          body = body + '&client_secret=' + clientSecret;
       }
       body = body + '&redirect_uri=' + redirectURL;
      
       //URL encode Post Body
       String encodedBody = EncodingUtil.urlEncode(body, 'UTF-8');
      
       // Set request body
       req.setBody(body);
      
       //Add Headers
       req.setHeader('Content-Type','application/x-www-form-urlencoded');
      
       //Send Token Request
       HttpResponse res = h.send(req);
      
       if (res.getStatusCode() == 200) {
           //Extract Token from Response
           Map<String,Object> tokenResponseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
           return (String)tokenResponseMap.get('access_token');
       } else {
           return null;
       }
   }
  
   // Response Wrapper
   global class ExchangeResponse {
       String access_token;
       String state;
       String errMsg;
       Boolean success; 
      
       public ExchangeResponse(String access_token, String state) {
           this.access_token = access_token;
           this.state = state;
           this.success = true;
       }
      
        public ExchangeResponse(String errMsg) {
           this.success = false;
           this.errMsg = this.errMsg;
       }       
   }
}

Hier volgt een gedetailleerde analyse van deze stroom.

Eindgebruiker opent externe app en logt in

Uw gebruiker opent uw externe app met de bedoeling in te loggen. In uw app wordt het inlogformulier weergegeven, met velden voor gebruikersnaam en wachtwoord, en een inlogknop. Salesforce biedt dit inlogformulier niet. Hoe het eruitziet is aan u. Uw gebruiker geeft zijn of haar gebruikersnaam en wachtwoord op en klikt op de inlogknop.

Externe app genereert code_verifier en code_challenge (optioneel)

Als u de extensie Proof Key for Code Exchange (PKCE) gebruikt, genereert de app waarden die worden gebruikt om de autorisatiecode te verifiëren.

Het wordt sterk aanbevolen de PKCE-extensie te gebruiken wanneer u de stroom Autorisatiecode- en inloggegevens implementeert. Zie specificatie RFC 7636 voor meer informatie over PKCE: Bewijssleutel voor codeuitwisseling door openbare OAuth-clients, geleverd door de Internet Engineering Task Force (IETF).

De PKCE-specificatie gedefinieerd in RFC 7636 bevat ook een optionele code_challenge_method die u kunt verzenden in de autorisatieaanvraag. Salesforce negeert elke waarde die u in deze parameter verzendt en gaat standaard over op SHA256.

Als u deze stroom implementeert met behulp van een callback-handler aan de serverzijde, schakelt u de instellingen voor Geheim vereisen voor webserverstroom en Geheim vereisen voor stroom voor vernieuwingstoken in uw externe clientapp of verbonden app in. Als u deze instellingen inschakelt, moet u ervoor zorgen dat uw callback-handler de veiligheid van het consumentengeheim garandeert.

Externe app vraagt headless een autorisatiecode aan

De externe app verzendt vanuit de browser een headless autorisatieaanvraag naar het autorisatie-eindpunt van de Headless Login-API op uw Experience Cloud-site met behulp van AJAX (Asynchronous Java and XML). Als u headless gebruikers ontdekken niet gebruikt, kunt u voor dit verzoek de methode GET of POST gebruiken. Als u headless gebruikers ontdekken gebruikt, worden alleen POST-verzoeken ondersteund.

In dit voorbeeld van JavaScript aan de clientzijde verzendt de startLogin headless een POST-aanvraag naar het autorisatie-eindpunt.

function startLogin() {
   var username = document.getElementById('user_name').value;
   var password = document.getElementById('password').value;
   var encodedUNP = btoa(username + ':' + password);
   var client = new XMLHttpRequest();
   client.open("POST", baseURL + "/services/oauth2/authorize", true);
   client.setRequestHeader("Auth-Request-Type", "Named-User");
   client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   client.setRequestHeader("Authorization", "Basic " + encodedUNP);
   client.send("response_type=code_credentials&client_id=" + clientId + "&redirect_uri=" + redirectURL);
   client.onreadystatechange = function() {
       if(this.readyState == 3) {
           console.log("here");
           console.log(client.response);
           response = JSON.parse(client.response);
           if (response.success) {
               getUserInfo(response.access_token, baseURL);
           }
       }
   }
   return false;
}  

Voor zowel GET- als POST-aanvragen moet u de Auth-Request-Type: Named-User van de header opnemen.

Als u deze stroom wilt verbinden met de headless gaststroom, kunt u desgewenst een Uvid-Hint opnemen met een op JWT gebaseerd toegangstoken dat een UVID-waarde bevat. Dit is een universeel unieke identifier (UUID) van versie 4, die volledig door uw app wordt gegenereerd en beheerd. Als u een toegangstoken met een UVID wilt verkrijgen, moet u uw externe clientapp of verbonden app inschakelen om op JWT gebaseerde toegangstokens uit te geven en de headless gaststroom in uw app te implementeren.

Als u de gastgebruikersstroom implementeert in uw app, kunt u deze header optioneel gebruiken om een op JWT (JSON Web Token) gebaseerd toegangstoken door te geven met daarin een unieke bezoekers-ID die is gekoppeld aan de identiteit van een gastgebruiker. Door de UVID door te geven aan een benoemde gebruikersstroom kunt u contextuele informatie van een gastgebruikerssessie, zoals de cookievoorkeuren van de gebruiker, overdragen aan een benoemde gebruikerssessie.

U kunt ook de normale UVID-waarde opnemen in de hoofdtekst van de aanvraag.

Afhankelijk van de methode die u gebruikt en uw configuratie, moet u soms een autorisatieheader van het type Basic opnemen met daarin de inloggegevens van de gebruiker. Als u een GET-aanvraag gebruikt, moet u de inloggegevens van de gebruiker (gebruikersnaam en wachtwoord) aan elkaar plaatsen en deze met Base64 gecodeerd verzenden in een autorisatieheader. Hier is een voorbeeld van een GET-aanvraag.

GET /services/oauth2/authorize? HTTP 1.1
Host: MyDomainName.my.site.com
Auth-Request-Type: Named-User
Authorization: Basic <encoded username:password>

response_type=code_credentials&
redirect_uri=https://www.MyDomainName.my.site.com/services/apexrest/code/exchange&
client_id=******&
code_challenge=Y29kZ*******

Als u een POST-aanvraag gebruikt, kunt u de met Base64 gecodeerde inloggegevens van de gebruiker opnemen in een autorisatieheader of kunt u ze in de hoofdtekst van de aanvraag plaatsen.

Als u ontdekking van headless gebruikers gebruikt, verzendt u geen gebruikersnaam en wachtwoord. In plaats daarvan verzendt u een identifier in de parameter login_hint, optionele aangepaste gegevens en een wachtwoord. Neem de identifier, aangepaste gegevens en het wachtwoord op in de hoofdtekst van een POST-aanvraag. Gebruik geen GET-verzoek.

Opmerking
Opmerking Als u de instelling Inloggegevens voor gebruikers vereisen in de POST-hoofdtekst voor autorisatiecode- en inloggegevens hebt ingeschakeld voor uw externe clientapp of verbonden app, kunt u de inloggegevens van de gebruiker alleen verzenden in de hoofdtekst van de aanvraag. Als deze instelling is ingeschakeld, kunt u de methode GET niet gebruiken voor de aanvraag van de autorisatiecode. U kunt alleen de POST-methode gebruiken.

Neem bij de GET- en POST-methoden deze verplichte parameters op in de hoofdtekst van de autorisatieaanvraag.

ParameterBeschrijving
client_id De consumentensleutel van de externe clientapp of verbonden app.
redirect_uri

De URL waar gebruikers naartoe worden omgeleid na een succesvolle authenticatie. De omleidings-URI moet overeenkomen met een van de waarden in het veld Call-back-URL van de externe clientapp of de verbonden app. Als dat niet het geval is, mislukt de goedkeuring.

Gebruik voor privéclients een redirect_uri die verwijst naar uw callback-handler aan serverzijde. Wijs bijvoorbeeld naar een Apex REST-code-uitwisselingseindpunt, zoals <Experience Cloud Domain>/services/apexrest/code/exchange.

response_type Het OAuth 2.0-toekenningstype dat de app aanvraagt. Voor de stroom Autorisatiecode- en inloggegevens moet de waarde code_credentials.

U kunt ook deze optionele parameters in de autorisatieaanvraag opnemen.

ParameterBeschrijving
code_challenge

Verplicht als u de PKCE-extensie gebruikt. Geeft de SHA256-hashwaarde aan van de code_verifier in de tokenaanvraag. Stel deze parameter in om onderscheppingsaanvallen op de autorisatiecode te helpen voorkomen. De waarde moet ook base64url-gecodeerd zijn, zoals gedefinieerd in https://tools.ietf.org/html/rfc4648#section-5.

Deze parameter is verplicht als er een code_verifier is opgegeven in de tokenaanvraag.

  • Als de code_challenge is opgegeven in de autorisatieaanvraag en er een code_verifier is opgegeven in de tokenaanvraag, vergelijkt Salesforce de code_challenge met de code_verifier. Als de code_challenge ongeldig is of niet overeenkomt, mislukt het inloggen met de invalid_request.
  • Als de code_challenge wel is opgegeven in de autorisatieaanvraag, maar er geen code_verifier is opgegeven in de tokenaanvraag, mislukt het inloggen met de invalid_grant.
scope Machtigingen die het type beschermde resources definiëren waartoe een externe clientapp of verbonden app toegang kan krijgen. U wijst bereiken toe aan een verbonden app wanneer u deze samenstelt; tevens worden deze opgenomen bij de OAuth-tokens tijdens de autorisatiestroom. Als u deze parameter niet opneemt, wordt om alle bereiken gevraagd, die zijn toegewezen aan de app. Als u de bereiken verder wilt beperken, geeft u een subset van de toegewezen bereiken door in deze parameter. Zie OAuth-bereiken voor geldige parameters.
state De status waarvan de externe webservice vraagt dat deze naar de call-back-URL wordt verzonden. Deze waarde moet een URL-codering hebben.
uvid_hint

Een waarde voor platte UVID, een UUID voor versie 4, die volledig door uw app wordt gegenereerd en beheerd. Als u een UVID wilt krijgen, moet u uw app op JWT gebaseerde toegangstokens laten uitgeven en de headless gaststroom implementeren in uw app. U kunt deze parameter optioneel gebruiken om een UVID-waarde door te geven die is gekoppeld aan de identiteit van een gastgebruiker, waarbij contextuele informatie van een gastgebruikerssessie wordt overgedragen naar een benoemde gebruikerssessie.

In plaats van de UVID door te geven in de hoofdtekst van de aanvraag, kunt u deze ook doorgeven in een op JWT gebaseerd token met een UVID via de UVID-Hint.

login_hint Verplicht bij gebruik van headless user discovery. Een identifier die uw Apex handler gebruikt om de Salesforce-account van een gebruiker te vinden. Verzamel bijvoorbeeld het ordernummer van een gebruiker in uw app en geef dit door in de parameter login_hint. We sturen de login_hint rechtstreeks naar uw Apex handler.
customdata

Verplicht als u een headless handler voor ontdekking van gebruikers gebruikt die aangepaste gegevens afhandelt. Als u de handler bijvoorbeeld ook gebruikt met een inlogstroom die aangepaste gegevens afhandelt, moet u aangepaste gegevens doorgeven in de stroom voor vergeten wachtwoord.

Een JSON-tekenreeks met aanvullende gegevens die uw Apex headless Discovery-handler gebruikt om de Salesforce-account van een gebruiker te vinden. Geef bijvoorbeeld informatie door over de omgeving van de gebruiker.

(Optioneel) Handler voor ontdekken van headless gebruiker vindt de gebruiker

Als u een headless handler voor ontdekking van gebruikers gebruikt, neemt de handler de parameters login_hint en customdata en zoekt de gekoppelde gebruiker. De handler bevestigt dat het e-mailadres of telefoonnummer van de gebruiker is geverifieerd.

Zie Auth.HeadlessUserDiscoveryHandler voor een voorbeeldhandler.

Salesforce valideert de inloggegevens en retourneert een 302-omleiding

De Salesforce-API Headless Login valideert de inloggegevens van de gebruiker en app en retourneert een 302-omleiding naar een vooraf geconfigureerde URL die de autorisatiecode bevat. De 302-omleiding wordt verwerkt binnen de browser en de respons wordt headless geleverd aan de omleidings-URL, die verwijst naar een vooraf geconfigureerd callback-eindpunt op uw server. Hier is een voorbeeld-URL.

https://www.MyDomainName.my.site.com/services/apexrest/code/exchange?code=aPrxC1*******
&sfdc_community_url=https%3A%2F%2FMyDomainName.my.site.com&sfdc_community_id=0DBxxxxxxxxxxxx

Callback-handler extraheert code en voert codeuitwisseling uit

De callback-handler aan de serverzijde extraheert de autorisatiecode en andere parameters uit de 302-omleiding. Vervolgens initieert de handler de codeuitwisseling door het headless verzenden van een POST-aanvraag naar het tokeneindpunt.

In het voorbeeld Apex REST callback-handler extraheert de methode doGet de code.

@RestResource(urlMapping='/code/exchange')
global class CodeExchangeAPI {
  
   @HttpGet
   global static ExchangeResponse doGet() {
       RestRequest req = RestContext.request;
       RestResponse res = RestContext.response;
       try {
           res.statusCode = 200;
          
              String accessToken = doCodeExchange(req.params.get('code'), req.params.get('sfdc_community_url'));
           if (accessToken != null) {
                return new ExchangeResponse(accessToken, req.params.get('state'));
           } else {
               return new ExchangeResponse('Could not parse auth code redirect URI');
           }
       } catch (Exception e) {
           res.statusCode = 500;
           return new ExchangeResponse('Could not parse auth code redirect URI');
       }
      
   }

Vervolgens verzendt de doCodeExchange de tokenaanvraag.

global static String doCodeExchange(String code, String communityURL) {
       String clientId = 'Connected App Client ID';
       String redirectURL = '<Experience Cloud Domain>/services/apexrest/code/exchange';
       String clientSecret = '<ConnecedApp Secret>';
      
       Http h = new Http();
       HttpRequest req = new HttpRequest();
       req.setMethod('POST');
      
       //Create Code Exchange URL
       String url = communityURL + '/services/oauth2/token';
       req.setEndpoint(url);
      
       //Post Body
       String body = 'grant_type=authorization_code';
       body = body + '&client_id=' + clientId;
       body = body + '&code=' + code;
       if (clientSecret != null) {
          body = body + '&client_secret=' + clientSecret;
       }
       body = body + '&redirect_uri=' + redirectURL;
      
       //URL encode Post Body
       String encodedBody = EncodingUtil.urlEncode(body, 'UTF-8');
      
       // Set request body
       req.setBody(body);
      
       //Add Headers
       req.setHeader('Content-Type','application/x-www-form-urlencoded');
      
       //Send Token Request
       HttpResponse res = h.send(req);
      
       if (res.getStatusCode() == 200) {
           //Extract Token from Response
           Map<String,Object> tokenResponseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
           return (String)tokenResponseMap.get('access_token');
       } else {
           return null;
       }
   }

Voor de aanvraag van een toegangstoken kunt u alleen een POST-aanvraag gebruiken. GET-aanvragen worden niet ondersteund. U moet een Content-Type opnemen. Neem deze verplichte parameters op in de hoofdtekst van de aanvraag.

ParameterBeschrijving
client_id De consumentensleutel van de externe clientapp of verbonden app.
client_secret Het consumentengeheim van de externe clientapp of verbonden app.
code De autorisatieserver maakt een autorisatiecode, een kort lopend token, en geeft het na succesvolle authenticatie door aan de client. De client verzendt de autorisatiecode aan de autorisatieserver om een toegangstoken en optioneel een vernieuwingstoken te verkrijgen.
grant_type Het type validatie dat de app kan bieden om te bewijzen dat het een veilige bezoeker is. Voor de stroom Autorisatiecode- en inloggegevens moet de waarde authorization_code zijn.
redirect_uri

De URL waar gebruikers naartoe worden omgeleid na een succesvolle authenticatie. De omleidings-URI moet overeenkomen met een van de waarden in het veld Call-back-URL. Als dat niet het geval is, mislukt de goedkeuring. Deze waarde moet een URL-codering hebben.

Gebruik voor privéclients een redirect_uri die verwijst naar uw callback-handler aan serverzijde. Wijs bijvoorbeeld naar een Apex REST-code-uitwisselingseindpunt, zoals <Experience Cloud Domain>/services/apexrest/code/exchange.

U kunt ook deze optionele parameters opnemen in de tokenaanvraag.

ParameterBeschrijving
code_verifier

Verplicht als u de PKCE-extensie gebruikt. Geeft 128 bytes aan willekeurige gegevens met hoge entropie op om het raden van de code te bemoeilijken. Stel deze parameter in om onderscheppingsaanvallen op de autorisatiecode te helpen voorkomen. De waarde moet ook met base64url gecodeerd zijn, zoals gedefinieerd in https://tools.ietf.org/html/rfc4648#section-5.

  • Als de waarde voor code_verifier wel in het tokenverzoek is opgegeven en er een waarde voor code_challenge in het autorisatieverzoek voorkomt, vergelijkt Salesforce code_verifier met code_challenge. Als de code_verifier ongeldig is of niet overeenkomt, mislukt het inloggen met de invalid_grant.
  • Als de waarde code_verifier wel is opgegeven in de tokenaanvraag, maar er geen waarde code_challenge is opgegeven in de autorisatieaanvraag, mislukt het inloggen met de foutcode invalid_grant.
format

De verwachte indeling van de respons. Salesforce ondersteunt deze indelingen.

  • urlencoded
  • json (standaard)
  • xml

In de Apex-code stelt de responswrapper de variabelen in die uiteindelijk worden teruggestuurd naar de app, inclusief geslaagd- en foutindicatoren.

 // Response Wrapper
   global class ExchangeResponse {
       String access_token;
       String state;
       String errMsg;
       Boolean success; 
      
       public ExchangeResponse(String access_token, String state) {
           this.access_token = access_token;
           this.state = state;
           this.success = true;
       }
      
        public ExchangeResponse(String errMsg) {
           this.success = false;
           this.errMsg = this.errMsg;
       }       
   }

Salesforce verleent een toegangstoken

De Salesforce-API Headless Login ontvangt de tokenaanvraag en retourneert een respons met toegangstoken naar de callback-handler aan de serverzijde. Dit is een voorbeeld van een respons met een toegangstoken in de JSON-indeling.

{
"access_token":"*******************",
"sfdc_community_url":"https://MyDomainName.my.site.com",
"sfdc_community_id":"0DBxxxxxxxxxxxx",
"signature":"ts6wm/svX3jXlCGR4uu+SbA04M6qhD1SAgVTEwZ59P4=",
"scope":"openid api",
"id_token":"XXXXXX",
"instance_url":"https://yourInstance.salesforce.com",
"id":"https://yourInstance.salesforce.com/id/00Dxxxxxxxxxxxx/005xxxxxxxxxxxx",
"token_type":"Bearer",
"issued_at":"1667600739962"
}

De respons met het toegangstoken bevat deze verplichte parameters.

Parameter Beschrijving
access_token Een OAuth-token dat de externe clientapp of verbonden app gebruikt om toegang tot een beschermde resource aan te vragen namens de clienttoepassing. Het toegangstoken kan vergezeld gaan van aanvullende machtigingen in de vorm van bereiken.
id Een identiteits-URL die kan worden gebruikt voor het identificeren van de gebruiker en voor het uitvoeren van een query voor meer informatie over de gebruiker. Zie Identiteits-URL's.
instance_url Een URL die het exemplaar van de organisatie van de gebruiker aangeeft. Bijvoorbeeld: https://yourInstance.salesforce.com/.
issued_at Het tijdstempel waarop de handtekening is gemaakt, uitgedrukt als het aantal milliseconden vanaf 1970-01-01T0:0:0Z UTC.
signature Base64-gecodeerde HMAC-SHA256-handtekening ondertekend met de client_secret. De handtekening kan de aaneengeschakelde ID en issued_at value bevatten, die u kunt gebruiken om te controleren of de identiteits-URL niet is gewijzigd sinds de server deze heeft verzonden.
sfdc_community_url De URL van de Experience Cloud-site.
sfdc_community_id De Experience Cloud-site-ID van de gebruiker.
token_type Een Bearer, dat wordt gebruikt voor alle responsen die een toegangstoken bevatten.

De toegangstokenrespons kan ook deze parameters bevatten.

Parameter Beschrijving
id_token

Een structuur voor ondertekende gegevens, die kenmerken van de geauthenticeerde gebruiker bevat, inclusief een unieke identifier voor de gebruiker en een tijdstempel dat aangeeft wanneer het token is uitgegeven. Het identificeert ook de aanvragende clienttoepassing. Zie OpenID Connect-specificaties.

Deze parameter wordt geretourneerd als de parameter scope openid bevat.

refresh_token Token dat wordt verkregen van de webserver-, User-agent- of stroom voor tokens voor hybride apps. Deze waarde is geheim. Neem afdoende maatregelen om deze te beschermen. Deze parameter wordt alleen geretourneerd als uw externe clientapp of verbonden app is ingesteld met een refresh_token.
state De status die door de client is aangevraagd. Deze waarde wordt alleen opgenomen als de parameter state is opgenomen in de oorspronkelijke querytekenreeks.

Callback-handler verwerkt tokenrespons en retourneert parameters naar app

De callback-handler aan de serverzijde krijgt het toegangstoken uit de respons. In het voorbeeld van Apex code aan de serverzijde vindt dit proces plaats binnen de methode doCodeExchange als onderdeel van het verzenden van de tokenaanvraag.

//Send Token Request
       HttpResponse res = h.send(req);
      
       if (res.getStatusCode() == 200) {
           //Extract Token from Response
           Map<String,Object> tokenResponseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
           return (String)tokenResponseMap.get('access_token');
       } else {
           return null;
       }

De callback-handler aan de serverzijde retourneert het toegangstoken en de status aan de browser, samen met gebruikersgegevens, tokens en sessiegegevens. In ons voorbeeld retourneert de responswrapper het toegangstoken naar de app. Als best practice wordt aangeraden om uw server te configureren voor opslag van het toegangstoken, een sessie voor de app te maken en de sessie terug te sturen naar de app, in plaats van het toegangstoken te retourneren. Als ontwikkelaar hebt u volledige controle over het maken van de sessie, het opslaan van het toegangstoken en het beheren van de inlogstatus. Dit betekent dat u de specifieke implementatie helemaal zelf kunt bepalen.

Hier is een voorbeeld van een geslaagde respons in het logboek in de browserconsole.

{"success":true,"state":"https://MyExperienceCloudSite.my.site.com/","errMsg":null,"access_token":"00*******"}

App verwerkt tokenrespons en zet de gebruikerssessie op

De app ontvangt de tokenrespons, verwerkt deze en maakt de gebruikerssessie. In het voorbeeld van JavaScript aan de clientzijde wordt de respons verwerkt via de getUserInfo.

function getUserInfo(accessToken, userInfoBaseURL) {
   var client = new XMLHttpRequest();
   client.open("GET", userInfoBaseURL + "/services/oauth2/userinfo", true);
   client.setRequestHeader("Content-Type", "application/json");
   client.setRequestHeader("Authorization", "Bearer " + accessToken);
   client.send();
   client.onreadystatechange = function() {
       if(this.readyState == 3) {
           response = JSON.parse(client.response);
           response.access_token = accessToken;
           document.getElementById("json").textContent = JSON.stringify(response, undefined, 2);
           document.getElementById("results").style.display="block";
       }
   }
}

Eindgebruiker is ingelogd en voert een actie in de app uit

Uw gebruiker is nu ingelogd en voert een actie in uw app uit die toegang tot Salesforce-gegevens vereist. De gebruiker klikt bijvoorbeeld op een knop om zijn of haar historie van geboekte reizen weer te geven, die is opgeslagen in Salesforce.

Opmerking
Opmerking Wanneer u uw externe clientapp of verbonden app instelt voor de stroom Autorisatiecode- en inloggegevens, stelt u het beleid Toegestane gebruikers in op Door beheerder goedgekeurde gebruikers en configureert u welke profielen of machtigingensets toegang hebben tot de app. Met dit beleid krijgen gebruikers toegang tot de app zonder deze te autoriseren, waardoor ze geen autorisatiescherm zien waarin hen wordt gevraagd de app toegang tot hun gegevens te verlenen.

App verstuurt een geauthenticeerde aanvraag naar een Salesforce-eindpunt

Om toegang tot de Salesforce-gegevens van de gebruiker te krijgen gebruikt uw app het toegangstoken om een geauthenticeerde aanroep te doen naar een beschermd Salesforce-eindpunt, zoals een Salesforce-API.

Eindgebruiker heeft toegang tot Salesforce-gegevens

De gebruiker heeft nu toegang tot beschermde Salesforce-gegevens in uw app. De gebruiker kan bijvoorbeeld zijn of haar historie van geboekte reizen zien. Vanuit het perspectief van de eindgebruiker heeft het hele proces, van inloggen tot toegang tot de gebruikersgegevens, plaatsgevonden zonder dat de gebruiker ooit de app heeft hoeven verlaten.

 
Wordt geladen
Salesforce Help | Article