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 |
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.
- Voldoen aan randvoorwaarden voor Headless Identity.
- Integreer uw off-platform app met Salesforce met behulp van een van deze opties.
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.
- 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.
Neem bij de GET- en POST-methoden deze verplichte parameters op in de hoofdtekst van de autorisatieaanvraag.
| Parameter | Beschrijving |
|---|---|
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 |
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.
| Parameter | Beschrijving |
|---|---|
code_challenge |
Verplicht als u de PKCE-extensie gebruikt. Geeft de SHA256-hashwaarde aan van de Deze parameter is verplicht als er een
|
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 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 |
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.
| Parameter | Beschrijving |
|---|---|
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 |
U kunt ook deze optionele parameters opnemen in de tokenaanvraag.
| Parameter | Beschrijving |
|---|---|
code_verifier |
Verplicht als u de PKCE-extensie gebruikt. Geeft 128 bytes aan willekeurige gegevens met hoge entropie op om het raden van de
|
format |
De verwachte indeling van de respons. Salesforce ondersteunt deze indelingen.
|
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 |
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.
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.
