Sidhuvudlösa identitets-API:n: Auktoriseringskod och inloggningsuppgifter för offentliga klienter
För offentliga klienter som appar på en sida eller mobilappar kan du konfigurera sidhuvudlös inloggning för kunder och partners genom att använda auktoriseringskoden och inloggningsuppgifter. Detta flöde är byggt på beviljandetypen OAuth 2.0-auktoriseringskod. Med auktoriseringskoden och inloggningsuppgifter-flödet styr du frontend-inloggningsupplevelsen i en tredjepartsapp. Du anropar Salesforces sidhuvudlösa inloggnings-API via din Experience Cloud-webbplats för att hantera backend-arbetet för att autentisera användare och bevilja åtkomst till skyddade Salesforce-resurser. Med separata frontend- och backend-processer kan dina användare logga in och komma åt Salesforce-data utan att lämna din app. För appar med en sida använder du en callback-slutpunkt på serversidan för att extrahera auktoriseringskoden och du utför kodutbytet från webbläsaren via JavaScript på klientsidan.
Versioner som krävs
| Tillgängliga i: både Salesforce Classic och Lightning Experience |
| Tillgängliga i: Enterprise, Unlimited och Developer Edition |
Detta hjälpinnehåll beskriver hur du konfigurerar flödet och hur det fungerar. För att konfigurera en implementering från början till slut, se Införandeguide för sidhuvudlös identitet.
Innan du konfigurerar detta flöde, utför dessa steg.
- Uppfyll förkraven för Sidhuvudlös identitet.
- Integrera din app utanför plattformen med Salesforce med ett av dessa alternativ.
Eftersom du hanterar Salesforce Customer Identity via Experience Cloud-webbplatser kan du endast konfigurera auktoriseringskoden och inloggningsuppgifter för kunder och partner som använder en Experience Cloud-webbplatsunderdomän som https://MyExperienceCloudSite.my.site.com. Det går inte att konfigurera detta flöde för anställda som får åtkomst till Salesforce Platform med login.salesforce.com eller din organisationsspecifika inloggnings-URL för Min domän, eller för anställda som får åtkomst till Experience Cloud-webbplatser.
Här är ett exempel på ett användningsfall för auktoriseringskoden och inloggningsuppgifter. Du arbetar för ett företag som lagrar kunddata i Salesforce. Du har skapat en egen app, och du vill att användare ska ha åtkomst till sina tidigare besöksbokningar från din app. Du vill även ha fullständig kontroll över inloggningsupplevelsen så att du kan anpassa den till ditt företags varumärkesprofil. Så du konfigurerar din egna app som en extern klientapp eller ansluten app och konfigurerar flödet Auktoriseringskod och Inloggningsuppgifter.
Som standard anger användare sitt användarnamn för att logga in. För att ge användare fler alternativ, konfigurera sidhuvudlös användarupptäckt. Utveckla till exempel ett flöde där användare anger sin e-postadress, telefonnummer eller till och med ett ordernummer. Se Sidhuvudlös inloggning utan användarnamn.
Här är en förenklad översikt av flödet i åtgärd.
- Din användare går till din egna app där ditt inloggningsformulär visas som standard i appen, och anger sitt användarnamn och lösenord. Eller, om du använder sidhuvudlös användarupptäckt, anger de en identifierare som en e-postadress, ett telefonnummer eller ett ordernummer, tillsammans med sitt lösenord.
- Om du använder tillägget Proof Key for Code Exchange (PKCE) skapar appen värden som används för att verifiera auktoriseringskoden. Om du inte använder PKCE hoppar ditt flöde över detta steg. Vi rekommenderar starkt att du alltid använder PKCE när du implementerar detta flöde för appar med en sida.
- Från webbläsaren skickar din egna app—via JavaScript—en begäran om sidhuvudlös auktorisering till Salesforce Headless Login API-auktoriseringsslutpunkten på din Experience Cloud-webbplats.
- Om du använder sidhuvudlös användarupptäckt hittar din Apex hanterare användaren baserat på den identifierare som de använde för att logga in. Om användaruppgifterna är giltiga och användaren har en verifierad e-postadress eller telefonnummer fortsätter inloggningen.
- Salesforces sidhuvudlösa inloggnings-API validerar användarens inloggningsuppgifter och returnerar en HTTP 302-omdirigering till en förkonfigurerad URL som innehåller auktoriseringskoden. Salesforce skickar sedan automatiskt omdirigeringssvaret till omdirigerings-URL:en, som pekar till callbackhanteraren på serversidan.
- Callbackhanteraren på serversidan extraherar auktoriseringskoden från 302-omdirigeringen och returnerar den till appen.
- JavaScript på klientsidan tar emot URL-parametrarna för omdirigering och inleder kodutbytet med en POST-begäran till tokenslutpunkten.
- Salesforce Headless Login API validerar begäran och returnerar ett åtkomsttokensvar till appen.
- JavaScript på klientsidan i appen bearbetar åtkomsttoken och skapar användarens session.
- Användaren är nu inloggad och utför en åtgärd i din egna app som startar en begäran om Salesforce-data. Till exempel klickar de på en knapp för att komma till sin historik för besöksbokning, som lagras i Salesforce Experience Cloud-webbplatsen.
- Din egna app gör en autentiserad begäran till en skyddad Salesforce-slutpunkt, till exempel en Salesforce API.
- Användaren kan nu komma åt sina skyddade data i din egna app. De kan till exempel se sin historik för besöksbokning.
En nyckelkomponent i detta flöde är JavaScript på klientsidan som skickar auktoriseringsbegäran, utför kodutbytet och bearbetar åtkomsttoken. Här är ett JavaScript-exempel som använder en ansluten app.
var clientId = "<Connected App Client ID>";
var baseURL = "<Experience Cloud Domain>";
var redirectURL = "<Experience Cloud Domain>/services/apexrest/code/extraction"
// Performs the code exchange
function doCodeExchange(authorizeResponse) {
//Perform Code Exchange
//Get Access Token
var client = new XMLHttpRequest();
client.open("POST", authorizeResponse.sfdc_community_url + "/services/oauth2/token", true);
client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
client.send("code=" + authorizeResponse.code + "&grant_type=authorization_code&client_id=" + clientId + "&redirect_uri=" + redirectURL);
client.onreadystatechange = function() {
if(this.readyState == 3) {
response = JSON.parse(client.response);
getUserInfo(response.access_token, response.sfdc_community_url)
}
}
}
// Gets User Info
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";
}
}
}
//Starts the Login Process
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) {
response = JSON.parse(client.response);
doCodeExchange(response);
}
}
return false;
}
En annan nyckelkomponent är callbackhanteraren på serversidan som extraherar koden från 302-omdirigeringen och returnerar den till appen. I detta exempel är hanteraren en Apex klass som visas som en offentlig REST-slutpunkt och har Cross Origin Resource Sharing (CORS) aktiverat för att erbjuda skydd för skript för flera webbplatser. För att förenkla utveckling, använd OAuth 2.0-ekoslutpunkten för att hämta auktoriseringskoden.
@RestResource(urlMapping='/code/extraction')
global class CodeExtractorAPI {
@HttpGet
global static CodeResponse doGet() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
try {
res.statusCode = 200;
return new CodeResponse(req.params.get('code'), req.params.get('sfdc_community_url'), req.params.get('sfdc_community_id'), req.params.get('state'));
} catch (Exception e) {
res.statusCode = 500;
return new CodeResponse('Could not parse auth code redirect URI');
}
}
// Response Wrapper
global class CodeResponse {
String code;
String sfdc_community_url;
String sfdc_community_id;
String state;
Boolean success;
String errMsg;
public CodeResponse(String code, String sfdc_community_url, String sfdc_community_id, String state) {
this.code = code;
this.sfdc_community_url = sfdc_community_url;
this.sfdc_community_id = sfdc_community_id;
this.state = state;
this.success = true;
}
public CodeResponse(String errMsg) {
this.success = false;
this.errMsg = this.errMsg;
}
}
}
Här är en detaljerad översikt av detta flöde.
Slutanvändare öppnar tredjepartsappar och loggar in
Din användare öppnar din tredjepartsapp för att logga in. I din app visas ditt inloggningsformulär med fält för användarnamn och lösenord och en inloggningsknapp. Salesforce tillhandahåller inte detta inloggningsformulär. Dess utseende och känsla är upp till dig. Din användare anger sitt användarnamn och lösenord och klickar på inloggningsknappen.
Tredjepartsapp skapar code_verifier och code_challenge (valfritt)
Om du använder tillägget Proof Key for Code Exchange (PKCE) skapar appen värden som används för att verifiera auktoriseringskoden.
Ditt flöde inkluderar endast detta steg om du använder tillägget Proof Key for Code Exchange (PKCE). Som en rekommenderad metod för säkerhet rekommenderar vi starkt att använda tillägget PKCE när du implementerar auktoriseringskoden och inloggningsuppgifter, särskilt för appar med en sida. Mer information om PKCE finns i specifikationenRFC 7636: Proof Key for Code Exchange by OAuth Public Clients som tillhandahålls av Internet Engineering Task Force (IETF).
PKCE-specifikationen som definieras i RFC 7636 innehåller även en valfri code_challenge_method som du kan skicka i auktoriseringsbegäran. Salesforce ignorerar alla värden som du skickar i denna parameter och blir som standard SHA256.
Tredjepartsapp begär sidhuvudlöst en auktoriseringskod
Från webbläsaren skickar din egna app—via JavaScript—en begäran om sidhuvudlös auktorisering till Salesforces slutpunkt för auktorisering av Salesforce Headless Login API. Om du inte använder sidhuvudlös användarupptäckt, använd antingen GET- eller POST-metoden för denna begäran. Om du använder sidhuvudlös användarupptäckt stöds endast POST-begäranden.
I detta JavaScript-utdrag på klientsidan skickas auktoriseringsbegäran som en del av startLogin. Efter att ha hämtat användaruppgifterna konstruerar och skickar funktionen en POST-begäran, inklusive en omdirigerings-URL som pekar till callbackhanteraren på serversidan.
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;
}
För både GET- och POST-begäranden måste du inkludera sidhuvudets Auth-Request-Type: Named-User.
Beroende på vilken metod du använder och din externa klientapp eller anslutna appkonfiguration kan du ibland behöva inkludera ett auktoriseringssidhuvud av typen Grundläggande som innehåller användarens inloggningsuppgifter. Om du använder en GET-begäran måste du skicka användarens uppgifter—vilkens användarnamn och lösenord—senast tillagda till varandra och Base64-kodade—i ett auktoriseringssidhuvud. Här är ett exempel på en GET-begäran.
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.MyExperienceCloudSite.my.site.com/services/apexrest/code/extraction&
client_id=******&
code_challenge=Y29kZ*******
Om du använder en POST-begäran kan du inkludera Base64-kodade användaruppgifter i ett auktoriseringssidhuvud, eller så kan du placera dem i begärans brödtext.
Om du använder sidhuvudlös användarupptäckt skickar du inte användarnamn och lösenord. Istället skickar du en identifierare i login_hint, valfria egna data och ett lösenord. Inkludera identifierare, egna data och lösenord i brödtexten i en POST-begäran. Använd inte en GET-begäran.
Om du vill ansluta detta flöde till det sidhuvudlösa gästflödet kan du inkludera ett Uvid-Hint med en JWT-baserad åtkomsttoken som innehåller ett UVID-värde, vilket är en universellt unik identifierare (UUID) av version 4 som skapas och hanteras helt av din app. För att få en åtkomsttoken med en UVID måste du aktivera din externa klientapp eller anslutna app för att utfärda JWT-baserade åtkomsttokens och implementera det sidhuvudlösa gästflödet i din app.
Om du implementerar gästanvändarflödet i din app kan du om du vill använda detta sidhuvud för att skicka in en JSON Web Token-baserad åtkomsttoken (JWT) som innehåller ett unikt besökar-ID (UVID) knutet till en gästanvändares identitet. Genom att skicka UVID till ett namngivet användarflöde kan du överföra sammanhangsinformation från en gästanvändarsession, som användarens cookie-inställningar, till en namngiven användarsession.
Du kan även inkludera det vanliga UVID-värdet i begärans brödtext.
För både GET- och POST-metoder, inkludera dessa begärda parametrar i brödtexten i auktoriseringsbegäran.
| Parameter | Beskrivning |
|---|---|
client_id |
Konsumentnyckeln för den externa klientappen eller anslutna appen. |
redirect_uri |
Den URL dit användare omdirigeras efter en framgångsrik autentisering. Omdirigerings-URI måste matcha ett av värdena i fältet Callback-URL i den externa klientappen eller anslutna appen. Annars misslyckas godkännandet. För offentliga klienter måste omdirigerings-URI peka till en slutpunkt som kan bearbeta 302-omdirigeringen från Salesforce. För att förenkla utveckling, använd OAuth-ekoslutpunkten, till exempel https://MyExperienceCloudSite.my.site.com/services/oauth2/echo. Dessa exempel använder en slutpunkt för Apex REST-kodextrahering. Till exempel |
response_type |
Den OAuth 2.0 grant type som appen begär. För auktoriseringskoden och inloggningsuppgifter måste värdet code_credentials. |
Du kan även inkludera dessa valfria parametrar i auktoriseringsbegäran.
| Parameter | Beskrivning |
|---|---|
code_challenge |
Krävs om du använder tillägget PKCE. Anger SHA256-hashvärdet för Denna parameter krävs om en
|
scope |
Behörigheter som definierar vilken typ av skyddade resurser appen kan komma åt. Du tilldelar omfattningar till en extern klientapp eller ansluten app när du bygger den, och de inkluderas med OAuth-tokens under auktoriseringsflödet. Om du inte inkluderar denna parameter begärs alla omfattningar som är tilldelade till appen. För att begränsa omfattningarna ytterligare, skicka en underuppsättning av de tilldelade omfattningarna i denna parameter. För giltiga parametrar, se OAuth-omfång. |
state |
Ett läge som den externa webbtjänsten begär ska skickas till callback-URL:en. Detta värde måste vara URL-kodat. |
uvid_hint |
Ett vanligt Istället för att skicka UVID i begärans brödtext kan du även skicka den i en JWT-baserad token med en UVID via |
login_hint |
Krävs vid användning av headless user discovery. En identifierare som din Apex hanterare använder för att hitta en användares Salesforce-konto. Samla till exempel in en användares ordernummer i din app och skicka det till login_hint. Vi skickar login_hint direkt till din Apex hanterare. |
customdata |
Krävs om du använder en sidhuvudlös användares upptäckarhanterare som hanterar egna data. Om du till exempel även använder hanteraren med ett inloggningsflöde som hanterar egna data måste du skicka egna data i flödet för glömt lösenord. En JSON-sträng som innehåller ytterligare data som din Apex sidhuvudlösa upptäckare använder för att hitta en användares Salesforce-konto. Skicka till exempel information om användarens plats. |
(Valfritt) Sidhuvudlös användare Discovery-hanterare hittar användaren
Om du använder en upptäckare utan sidhuvud tar hanteraren parametrarna login_hint och customdata och hittar den associerade användaren. Hanteraren bekräftar att e-postadressen eller telefonnumret till användaren har verifierats.
För ett exempel på en hanterare, se Auth.HeadlessUserDiscoveryHandler.
Salesforce validerar inloggningsuppgifter och returnerar en 302-omdirigering till callbackhanterare på serversidan
Salesforce Headless Login API tar emot auktoriseringsbegäran. Den validerar användaruppgifterna och returnerar en HTTP 302-omdirigering till en förkonfigurerad URL som innehåller auktoriseringskoden. Salesforce skickar sedan automatiskt omdirigeringssvaret till omdirigerings-URL:en, som pekar till callbackhanteraren på serversidan vid /code/extraction slutpunkt i detta exempel. Under denna process omdirigeras inte webbläsaren—allt händer bakom kulisserna.
Callbackhanterare på serversidan extraherar kod och returnerar den till appen
Callbackhanteraren på serversidan extraherar auktoriseringskoden och andra data. Exemplet på Apex callbackhanterare använder metoden doGet för att extrahera koden, Experience Cloud-webbplatsens URL, webbplats-ID och status från 302-omdirigeringen.
@RestResource(urlMapping='/code/extraction')
global class CodeExtractorAPI {
@HttpGet
global static CodeResponse doGet() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
try {
res.statusCode = 200;
return new CodeResponse(req.params.get('code'), req.params.get('sfdc_community_url'), req.params.get('sfdc_community_id'), req.params.get('state'));
} catch (Exception e) {
res.statusCode = 500;
return new CodeResponse('Could not parse auth code redirect URI');
}
}
The response wrapper sets the variables for the code response, including success and error indicators.
// Response Wrapper
global class CodeResponse {
String code;
String sfdc_community_url;
String sfdc_community_id;
String state;
Boolean success;
String errMsg;
public CodeResponse(String code, String sfdc_community_url, String sfdc_community_id, String state) {
this.code = code;
this.sfdc_community_url = sfdc_community_url;
this.sfdc_community_id = sfdc_community_id;
this.state = state;
this.success = true;
}
public CodeResponse(String errMsg) {
this.success = false;
this.errMsg = this.errMsg;
}
}
Här är ett annat exempel på kodextrahering med PHP: Hypertextförprocessor (PHP).
<?
header('Access-Control-Allow-Headers: *');
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json; charset=utf-8');
$out = [];
foreach ($_GET as $name => $value) {
$out[$name] = $value;
}
echo json_encode($out);
?>
Efter att koden har extraherats skickar callbackhanteraren tillbaka den till webbläsaren.
Appen får kodsvar och utför kodutbyte
Webbläsaren får kodsvaret. Här är ett exempel på ett lyckat svar i webbläsarens konsollogg.
{"success":true,"state":"https://MyExperienceCloudSite.my.site.com/","sfdc_community_url":"https://MyExperienceCloudSite.my.site.com/vforcesite","sfdc_community_id":"0DBxxxxxxxxxxxx","errMsg":null,"code":"aPrxC1*******"}Webbläsaren begär sidhuvudlöst att byta ut koden mot en åtkomsttoken. I JavaScript-exemplet på klientsidan skickar doCodeExchange koden i en POST-begäran till Experience Cloud-tokenslutpunkten.
För att undvika att exponera konsumenthemligheten för webbläsaren måste du inaktivera inställningarna Kräv hemlighet för webbserverflöde och Kräv hemlighet för uppdateringstokenflöde i din externa klientapp eller anslutna app. Med dessa inställningar inaktiverade krävs inte konsumenthemligheten i auktoriseringsbegäran. Om möjligt rekommenderar vi att du utför kodutbytet med en serverbackend. Se Headless Identity APIs: Auktoriseringskod och inloggningsuppgifter för privata klienter.
var clientId = "<Connected App Client ID>";
var baseURL = "<Experience Cloud Domain>";
var redirectURL = "<Experience Cloud Domain>/services/apexrest/code/extraction"
// Performs the code exchange
function doCodeExchange(authorizeResponse) {
//Perform Code Exchange
//Get Access Token
var client = new XMLHttpRequest();
client.open("POST", authorizeResponse.sfdc_community_url + "/services/oauth2/token", true);
client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
client.send("code=" + authorizeResponse.code + "&grant_type=authorization_code&client_id=" + clientId + "&redirect_uri=" + redirectURL);
client.onreadystatechange = function() {
if(this.readyState == 3) {
response = JSON.parse(client.response);
getUserInfo(response.access_token, response.sfdc_community_url)
}
}
}
För åtkomsttokenbegäran kan du endast använda en POST-begäran—GET-begäranden stöds inte. Du måste inkludera ett Content-Type. Inkludera dessa begärda parametrar i begärans brödtext.
| Parameter | Beskrivning |
|---|---|
client_id |
Konsumentnyckeln för den externa klientappen eller anslutna appen. |
code |
Auktoriseringsservern skapar en auktoriseringskod, som är en kortlivad token, och skickar den till klienten efter framgångsrik autentisering. Klienten skickar auktoriseringskoden till auktoriseringsservern för att få en åtkomsttoken och, i relevanta fall, en uppdateringstoken. |
grant_type |
Den typ av validering som appen kan tillhandahålla för att bevisa att den är en säker besökare. För auktoriseringskoden och inloggningsuppgifter måste värdet vara authorization_code. |
redirect_uri |
Den URL dit användare omdirigeras efter en framgångsrik autentisering. Omdirigerings-URI måste matcha ett av värdena i fältet Callback-URL i den externa klientappen eller anslutna appen. Annars misslyckas godkännandet. För offentliga klienter måste omdirigerings-URI peka till en slutpunkt som kan bearbeta 302-omdirigeringen från Salesforce. För att förenkla utveckling, använd OAuth-ekoslutpunkten, till exempel https://MyExperienceCloudSite.my.site.com/services/oauth2/echo. Dessa exempel använder en slutpunkt för Apex REST-kodextrahering. Till exempel |
Du kan även inkludera dessa valfria parametrar i tokenbegäran.
| Parameter | Beskrivning |
|---|---|
client_secret |
Konsumenthemligheten för den externa klientappen eller anslutna appen. |
code_verifier |
Krävs om du använder tillägget PKCE. Specificerar 128 bytes slumpmässiga data med hög entropi för att göra det svårt att gissa
|
format |
Det förväntade formatet för svaret. Salesforce har stöd för dessa format.
|
Salesforce beviljar en åtkomsttoken
Efter att Salesforce har validerat appens inloggningsuppgifter returnerar Salesforce Headless Login API en åtkomsttoken till webbläsaren. Här är ett exempel på ett svar för åtkomsttoken i JSON-format.
{
"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"
}
Åtkomsttokensvaret innehåller dessa parametrar.
| Parameter | Beskrivning |
|---|---|
access_token
|
OAuth-token som en extern klientapp eller ansluten app använder för att begära åtkomst till en skyddad resurs åt klientprogrammet. Ytterligare behörigheter i form av omfattningar kan medfölja åtkomsttoken. |
id
|
En identitets-URL som kan användas både för att identifiera användaren och som en sökfråga för mer information om användaren. Se Identitets-URL:er. |
instance_url
|
En URL som anger instansen för användarens organisation. Exempel: https://yourInstance.salesforce.com/. |
issued_at
|
Tidsstämpel för när signaturen skapades, uttryckt som antal millisekunder från 1970-01-01T0:0:0Z UTC. |
signature
|
Base64-kodad HMAC-SHA256-signatur signerad med client_secret. Signaturen kan innehålla det sammanlänkade ID:t och issued_at value, som du kan använda för att bekräfta att identitets-URL:en inte har ändrats sedan servern skickade den. |
sfdc_community_url
|
URL för Experience Cloud-webbplatsen. |
sfdc_community_id
|
Användarens webbplats-ID för Experience Cloud. |
token_type
|
En Bearer som används för alla svar som innehåller en åtkomsttoken.
|
Åtkomsttokensvaret kan även inkludera dessa parametrar.
| Parameter | Beskrivning |
|---|---|
id_token
|
En signerad datastruktur som innehåller autentiserade användarattribut, inklusive en unik identifierare för användaren och en tidsstämpel som anger när token utfärdades. Den identifierar även den begärande klientappen. Se Specifikationer för OpenID Connect. Denna parameter returneras om scopeparametern inkluderar |
refresh_token
|
Token som fåtts från webbservern, användaragenten eller hybridappens tokenflöde. Detta värde är en hemlighet. Vidta lämpliga åtgärder för att skydda det. Denna parameter returneras endast om din externa klientapp eller anslutna app har konfigurerats med ett refresh_token. |
state
|
Det läge som begärs av klienten. Detta värde inkluderas endast om parametern state inkluderas i den ursprungliga sökfrågesträngen.
|
Appen bearbetar tokensvar och skapar användarsessionen
Webbläsaren lagrar informationen från tokensvaret och skapar användarsessionen. Vid denna tidpunkt är användaren inloggad och JavaScript på klientsidan anropar Salesforces slutpunkt för användarinfo för att bekräfta att inloggningen lyckades, enligt detta utdrag.
// Gets User Info
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";
}
}
}
Slutanvändare är inloggad och utför en åtgärd i appen
Din användare är nu inloggad. De utför en åtgärd i din app som kräver åtkomst till Salesforce-data. Till exempel klickar de på en knapp för att se sin historik för besöksbokning, som lagras i Salesforce.
App gör ett inloggad samtal till en Salesforce-slutpunkt
För att komma åt användarens Salesforce-data använder din app åtkomsttoken för att göra ett autentiserat anrop till en skyddad Salesforce-slutpunkt, till exempel en Salesforce API.
Slutanvändare har åtkomst till Salesforce-data
Användaren kan nu komma åt skyddade Salesforce-data i din app. De kan till exempel se sin historik för besöksbokning. Från slutanvändarens perspektiv, inträffar hela processen från att logga in till att komma åt deras data utan att behöva att de någonsin behöver lämna appen.
