OAuth 2.0 voor toepassingen van eerste partij: Stroom Headless registratie voor privéclients
Als u een registratieproces voor headless gebruikers wilt instellen voor een off-platform app die door uw bedrijf is ontwikkeld, gebruikt u deze stroom, die het conceptstandaardprotocol OAuth 2.0 voor toepassingen van eerste partij implementeert. Deze stroom wordt alleen ondersteund voor privéclients, zoals client-serverapps. Met deze stroom hebt u volledige controle over de front-end registratie-ervaring in uw eigen app, terwijl Salesforce het back-endwerk voor het verifiëren van gebruikers en verlenen van toegang tot beschermde resources afhandelt. Deze stroom wordt alleen ondersteund voor privéclients, zoals client-serverapps, en wordt alleen ondersteund voor externe gebruikers.
Vereiste editions
| Beschikbaar in: zowel Salesforce Classic als Lightning Experience |
| Beschikbaar in: Enterprise, Unlimited en Developer Edition |
Als u headless registratie wilt instellen voor een privéclient, kunt u ook deze versie van de stroom Autorisatiecode- en inloggegevens gebruiken, die Headless Identity-API's implementeert. Beide stromen realiseren dezelfde gebruikscase: registratie voor een app buiten het Salesforce-platform. Maar er zijn enkele belangrijke verschillen om in gedachten te houden.
| OAuth voor eigen apps | Headless Identity-API's |
|---|---|
| Alleen ondersteund voor privéclients. | Ondersteund voor openbare en privéclients. |
| Voldoet aan het conceptstandaardprotocol OAuth 2.0 voor toepassingen van eerste partij. | Eigen Salesforce-stroom die is samengesteld bovenop de OAuth 2.0-standaard. |
| Alleen ondersteund voor het framework van de externe Salesforce-clientapp. De enige manier om instellingen voor de externe clientapp voor deze stroom te configureren, is via de API voor metagegevens. | Ondersteund voor zowel de Salesforce External Client-app als frameworks voor verbonden apps. |
| Voor de beveiliging vereist deze stroom altijd een klantenattest JWT. Salesforce gebruikt het JWT van het cliëntenattest om te valideren dat de app door uw bedrijf is ontwikkeld. | Vereist ter beveiliging authenticatie of reCAPTCHA, maar geen clientattest-JWT. |
Voltooi deze stappen voordat u deze stroom instelt.
- Volledige randvoorwaarden voor headless identiteit.
- Genereer een cliëntenattest JWT.
- Configureer een externe Salesforce-clientapp.
- Configureer Experience Cloud-instellingen.
Hier volgt een overzicht van hoe de stroom werkt.
- Stap 1: Een eindgebruiker opent uw eigen app en klikt op Registreren.
- Stap 2: In uw app wordt een eigen registratieformulier weergegeven voor het verzamelen van gebruikersgegevens. U ontwerpt dit formulier en past het aan op basis van de gegevens die u wilt verzamelen.
- Stap 3: De gebruiker voert zijn of haar gegevens in uw app in. Hij of zij voert bijvoorbeeld zijn of haar gebruikersnaam, wachtwoord en voornaam in.
- Stap 4: Uw app maakt een klantenattest JWT. Het genereert ook parameters voor de extensie Proof Key for Code Exchang (PKCE).
- Stap 5: Om de registratie te initialiseren, dient uw app de gebruikersgegevens in bij het eindpunt services/oauth2/v1/authorization_challenge op uw Experience Cloud-site. De aanvraag omvat een cliëntenattest JWT.
- Stap 6: Om te bevestigen dat uw eigen app het verzoek heeft verzonden, valideert Salesforce het JWT van het clientattest en valideert vervolgens de andere parameters die in het verzoek zijn verzonden.
- Stap 7: Wanneer het verzoek is geslaagd, retourneert Salesforce een respons met een
auth_session. De respons geeft aan dat Salesforce de registratie heeft geïnitieerd en een eenmalig wachtwoord (OTP) naar de gebruiker heeft verzonden. - Stap 8: In uw app geeft u een eigen verificatieformulier weer. U bepaalt hoe dit formulier eruit ziet.
- Stap 9: De gebruiker krijgt een eenmalig wachtwoord en geeft dit op in het verificatieformulier.
- Stap 10: Als u een autorisatiecode wilt aanvragen, stuurt uw app nog een POST-aanvraag naar het eindpunt services/oauth2/v1/authorization_challenge. Het verzoek bevat de
auth_sessionen het eenmalige wachtwoord. - Stap 11: Als het verzoek is geslaagd, retourneert Salesforce een autorisatiecode naar uw app en beëindigt het de
auth_session. - Stap 12: Voor het uitwisselen van de code voor een toegangstoken stuurt uw externe app een aanvraag naar het eindpunt /services/oauth2/token.
- Stap 13: Salesforce retourneert een tokenrespons met daarin het toegangstoken.
- Stap 14: Uw externe app verwerkt de tokenrespons en zet de gebruikerssessie op.
- Stap 15: De gebruiker is nu ingelogd en voert een actie in uw app uit die een aanvraag van Salesforce-gegevens initieert.
- Stap 16: Uw app doet een geauthenticeerde aanvraag bij een beschermd Salesforce-eindpunt, zoals een Salesforce-API.
- Stap 17: De gebruiker heeft nu toegang tot zijn of haar beschermde gegevens in uw app.
Stap 1: Gebruiker opent externe app en klikt op Registreren
Een gebruiker opent uw eigen app en klikt op een registratiekoppeling. Of ze klikken op een koppeling voor toegang tot een resource die registratie vereist.
Stap 2: Registratieformulier voor weergaven van apps van eerste partij
In uw eigen app geeft u een eigen registratieformulier weer om informatie over de gebruiker te verzamelen. U hebt volledige controle over dit formulier, inclusief het uiterlijk en de werking ervan, en de gebruikersgegevens die u wilt verzamelen.
Er zijn enkele punten van belang als u gaat beslissen welke gegevens van gebruikers u wilt verzamelen. Wanneer uw app gebruikersgegevens indient bij het eindpunt van de autorisatie-uitdaging, controleert Salesforce op de aanwezigheid van een e-mailadres, gebruikersnaam, achternaam en wachtwoord. U kunt deze gegevens verzamelen van gebruikers of automatisch genereren, maar deze gegevens moeten worden opgenomen in uw POST-aanvraag. Wanneer u besluit welke gegevens u wilt opnemen, moet u een e-mailadres of telefoonnummer verzamelen zodat de gebruiker zijn of haar identiteit kan verifiëren.
Stap 3: Gebruiker voert gegevens in
De gebruiker voert in het registratieformulier van uw app zijn of haar gegevens in.
Stap 4: First-Party App Mint een Client Attestation JWT en genereert code_verifier en code_challenge voor PKCE
De app maakt een klantenattest JWT.
De app genereert ook waarden voor de PKCE-parameters die worden gebruikt om de autorisatiecode te verifiëren.
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.
Stap 5: App verzendt initiële aanvraag naar het eindpunt Autorisatie-uitdaging
Vanuit de browser verzendt uw app een POST-aanvraag naar het eindpunt services/oauth2/v1/authorization_challenge op uw Experience Cloud-site.
Neem deze header indien nodig op in uw verzoek.
| Header | Vereist? | Beschrijving |
|---|---|---|
Authorization: Bearer
|
Verplicht als u Authenticatie vereisen voor toegang tot deze API inschakelt in de sectie headless registratie op de pagina Inloggen en registratie van Experience Cloud. | Bevat een toegangstoken dat is uitgegeven aan een interne integratiegebruiker. U kunt het toegangstoken opvragen met elke standaardstroom van OAuth die door Salesforce wordt ondersteund. Zorg ervoor dat u het user_registration_api toewijst aan uw verbonden app of externe clientapp, of geef het als parameter door tijdens uw stroom. |
Neem deze parameters op in de hoofdtekst van de aanvraag.
| Parameter | Vereist? | Beschrijving |
|---|---|---|
password
|
Ja. | Het wachtwoord van de gebruiker. Het wachtwoord moet voldoen aan het wachtwoordbeleid dat is geconfigureerd voor het profiel of de organisatie. |
userdata
|
Ja. Zelfs als u deze informatie niet van de gebruiker verzamelt, moet u deze automatisch genereren en doorgeven in de parameter userdata. |
Bevat alle verplichte gebruikersgegevens. Salesforce vereist deze informatie minimaal in de parameter
|
recaptcha
|
Verplicht als deze voorwaarden op u van toepassing zijn:
|
Een versleuteld token dat wordt uitgegeven door de Google reCAPTCHA-API wanneer een gebruiker een reCAPTCHA-controle voltooit. |
recaptchaevent
|
Verplicht als deze voorwaarden op u van toepassing zijn:
|
Een JSON-object dat deze subparameters bevat.
Zie Google's reCAPTCHA-documentatie voor meer informatie. |
client_assertion
|
Ja. | Het clientattest-JWT dat u hebt gegenereerd, ondertekend door het certificaat dat is geconfigureerd voor uw externe clientapp. |
login_type
|
Nee. Als u deze parameter niet opneemt, gebruikt Salesforce standaard de e-mailmethode om de identiteit van de gebruiker te verifiëren. | De methode die wordt gebruikt om de identiteit van de gebruiker te verifiëren. Salesforce ondersteunt twee waarden voor de verificatiemethode: email en sms. |
customdata
|
Nee. | Bevat alle aangepaste gebruikersgegevens die u verzamelt. U kunt bijvoorbeeld het straatadres van de gebruiker opnemen. |
emailtemplate
|
Verplicht om meerdere e-mailsjablonen op te geven als goedgekeurde lijst voor e-mailsjablonen is ingeschakeld. Als u het toestaan van e-mailsjablonen niet hebt ingeschakeld, kunt u deze parameter niet opnemen. Als u deze parameter niet opneemt, gebruikt Salesforce de standaard-e-mailsjabloon die is geconfigureerd in uw Experience Cloud-instellingen, ongeacht of goedgekeurde lijsten zijn ingeschakeld. Als er geen sjabloon is geconfigureerd, gebruikt Salesforce een standaard OTP-e-mailsjabloon. |
De naam van de ontwikkelaar van de aangepaste e-mailsjabloon. Deze parameter kan alleen een e-mailsjabloon uit de goedgekeurde lijst bevatten. |
code_challenge
|
Verplicht als u PKCE hebt vereist voor uw externe clientapp. Voor een correcte werking van de beveiligingsvoorzieningen van deze stroom wordt sterk aangeraden om altijd PKCE te vereisen. | Geeft de SHA256-hashwaarde aan van de Als er een Als de |
Hier is een voorbeeld van een eerste registratieaanvraag.
POST /services/oauth2/v1/authorization_challenge? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
{
"userdata": {
"firstname": "Janice"
"lastname": "Edwards"
"email": "janice.edwards@example.com"
"username": "jedwards@myapp.com"
}
"customdata": {
"mobilePhone"="<mobile phone number>"
}
"password":"*********"
"recaptcha": "*******"
"login_type": "email"
"emailtemplate": "unfiled$public/SalesNewCustomerEmail"
"client_assertion": "Y2xpZW50YXNzZXJ0aW9u..."
}Stap 6: Salesforce valideert het verzoek
Salesforce probeert eerst het JWT van het clientattest te valideren door te valideren dat de handtekening die wordt doorgegeven in de parameter client_asssertion, overeenkomt met de handtekening voor het certificaat dat is geconfigureerd voor de externe clientapp.
Als het JWT van het clientattest niet geldig is, retourneert Salesforce een invalid_attestation en moet u de aanvraag opnieuw indienen met alle parameters die u oorspronkelijk hebt ingediend. Hier is een voorbeeld van een foutreactie.
Als het JWT van het clientattest geldig is, maar er andere problemen zijn met het verzoek, retourneert Salesforce een foutrespons die aangeeft wat er mis was met het verzoek. De respons bevat ook een parameter auth_session die 5 minuten geldig blijft nadat deze is uitgegeven. Gedurende de periode dat de auth_session geldig is, kunt u deze gebruiken om de aanvraag opnieuw in te dienen. Neem in de gecorrigeerde versies die u opnieuw indient, alleen de gecorrigeerde waarden op voor de parameters die ervoor hebben gezorgd dat het verzoek is mislukt. U moet de password ook bij elk verzoek opnieuw indienen, omdat Salesforce deze niet opslaat. Maar voor andere parameters geldt dat als ze niet hebben geleid tot het mislukken van het verzoek, u ze kunt weglaten. Ze worden al vertegenwoordigd door de auth_session.
auth_session, maar u kunt de aanvraag opnieuw indienen zonder deze parameters, tenzij deze ertoe hebben geleid dat de aanvraag is mislukt.Als bijvoorbeeld uw JWT van het cliëntenattest geldig is, maar het verzoek mislukt omdat de gebruikersnaam onjuist is, dient u opnieuw een verzoek in dat alleen de auth_session, username en password bevat.
Stap 7: Salesforce verzendt een eenmalig wachtwoord naar de gebruiker
Als het verzoek slaagt, retourneert Salesforce nog steeds een foutrespons omdat de autorisatiecode nog niet kan worden verleend. Maar deze keer geeft de foutrespons aan dat het inloggen is geïnitialiseerd en dat Salesforce een eenmalig wachtwoord heeft verzonden naar het e-mailadres of telefoonnummer van de gebruiker. Let op de login_initialized van de foutcode en de otp_sent van de staat om te controleren of de aanvraag is geslaagd. De respons bevat ook een parameter auth_session, die belangrijk is voor de volgende stap.
Hier is een voorbeeld van een respons.
HTTP/1.1 403 Forbidden
Content-Type: application/json
Cache-Control: no-store
{
"error": "authorization_required",
"auth_session": "uY29tL2F1dGhlbnRpY",
"error_code": "login_initialized",
"login_status": {
"type": "SMS",
"state": "otp_sent",
"displayData": "+120******58"
}
}Stap 8: In de app wordt een verificatieformulier weergegeven
In uw eigen app geeft u een verificatieformulier weer waarin de eindgebruiker zijn of haar eenmalig wachtwoord kan opgeven. Het uiterlijk van dit formulier is volledig aan u.
Stap 9: Gebruiker geeft het eenmalige wachtwoord op in het verificatieformulier
De gebruiker ontvangt het eenmalige wachtwoord en voert het in op het verificatieformulier in uw eigen app.
Stap 10: Uw app vraagt een autorisatiecode aan
Als u een autorisatiecode wilt aanvragen, stuurt uw app de auth_session en het eenmalige wachtwoord die de gebruiker heeft opgegeven, naar het eindpunt van de autorisatie-uitdaging met behulp van een andere POST-aanvraag naar services/oauth2/v1/authorization_challenge Dit verzoek heeft geen verplichte headers. Neem deze parameters op in de hoofdtekst van de aanvraag.
| Parameter | Vereist? | Beschrijving |
|---|---|---|
auth_session
|
Ja. | Vertegenwoordigt de inlogpoging. Gebruik de auth_session die u hebt ontvangen in de respons van uw eerste verzoek aan het eindpunt van de autorisatie-uitdaging. Zorg ervoor dat u de auth_session gebruikt uit het verzoek dat aangeeft dat het inloggen is geïnitialiseerd en het eenmalige wachtwoord is verzonden. |
login_otp
|
Ja. | Het eenmalige wachtwoord dat de eindgebruiker heeft opgegeven op het verificatieformulier van uw app. |
Hier is een voorbeeld van een verzoek.
POST /authorize HTTP/1.1
Host: MyExperienceCloudSite.my.site.com
auth_session=uY29tL2F1dGhlbnRpY*
login_otp=<otp_from_sms>Stap 11: Salesforce retourneert een autorisatiecode
Als het eenmalige wachtwoord correct is en het auth_session geldig is, retourneert Salesforce een autorisatiecode en wordt de auth_session beëindigd. Hier is een voorbeeld van een respons met autorisatiecode.
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
{
"authorization_code": "uY29tL2F1d******"
}Stap 12: Uw app wisselt de autorisatiecode uit voor een toegangstoken
Nadat u de autorisatiecode hebt ontvangen, stuurt uw app een aanvraag naar het Salesforce-tokeneindpunt.
Dit verzoek heeft geen headers. Neem deze parameters op in de hoofdtekst van de aanvraag.
| Parameter | Vereist? | Beschrijving |
|---|---|---|
code
|
Ja. | 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. |
client_id
|
Ja. | De consumentensleutel van de externe clientapp. |
client_secret
|
Ja. | Het consumentengeheim van de externe clientapp. In deze stroom fungeert deze als een wachtwoord dat de app gebruikt voor toegang tot Salesforce. |
redirect_uri
|
Ja. | 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. Als dat niet het geval is, mislukt de goedkeuring. Deze waarde moet een URL-codering hebben. |
grant_type
|
Ja. | Het type validatie dat de app kan bieden om te bewijzen dat het een veilige bezoeker is. Voor deze stroom moet de waarde authorization_code zijn. |
code_verifier
|
Verplicht als u PKCE hebt vereist voor uw externe clientapp. Voor een correcte werking van de beveiligingsvoorzieningen van deze stroom wordt sterk aangeraden om altijd PKCE te vereisen. | Geeft 128 bytes willekeurige gegevens met hoge entropie op om raden van de codewaarde moeilijk te maken. Stel deze parameter in om onderscheppingsaanvallen op de autorisatiecode te helpen voorkomen. De waarde moet base64url-gecodeerd zijn zoals gedefinieerd in https://datatracker.ietf.org/doc/html/rfc4648#section-5. Als de tokenaanvraag een Als de |
Hier is een voorbeeld van een tokenaanvraag.
POST services/oauth2/token? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
code=********&
client_id=**********&
client_secret=*********&
redirect_uri=<callback_URL>&
grant_type=authorization_code&
code_verifier=*******Stap 13: Salesforce verleent een toegangstoken
Na het valideren van de inloggegevens van de app. Salesforce retourneert een toegangstoken. 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 toegangstokenrespons bevat deze parameters.
| Parameter | Vereist? | Beschrijving |
|---|---|---|
access_token
|
Ja. | Een OAuth-token dat een externe clientapp 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
|
Ja. | 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. |
id_token
|
Nee. | 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 app. Zie OpenID Connect-specificaties. |
instance_url
|
Ja. | Een URL die het exemplaar van de organisatie van de gebruiker aangeeft. Bijvoorbeeld https://yourInstance.salesforce.com/. |
issued_at
|
Ja. | Een tijdstempel waarop de handtekening is gemaakt, uitgedrukt als het aantal milliseconden vanaf 1970-01-01T0:0:0Z UTC. |
refresh_token
|
Nee. | 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. |
signature
|
Ja. | Base64-gecodeerde HMAC-SHA256-handtekening ondertekend met de client_secret. De handtekening kan de aaneengeschakelde ID en issued_at bevatten, die u kunt gebruiken om te controleren of de identiteits-URL niet is gewijzigd sinds de server deze heeft verzonden. |
sfdc_community_url
|
Ja. | De URL van de Experience Cloud-site. |
sfdc_community_id
|
Ja. | De Experience Cloud-site-ID van de gebruiker. |
state
|
Nee. | De status die door de client is aangevraagd. Deze waarde wordt alleen opgenomen als de parameter state is opgenomen in de oorspronkelijke querytekenreeks. |
token_type
|
Ja. | Een Bearer, dat wordt gebruikt voor alle responsen die een toegangstoken bevatten. |
Stap 14: App maakt de sessie van de gebruiker
Uw externe app verwerkt de tokenrespons en zet de gebruikerssessie op.
Stap 15: Gebruiker is geregistreerd en voert een actie uit in de app
De gebruiker is nu geregistreerd en ingelogd. De gebruiker voert een actie uit in uw app waarvoor toegang tot Salesforce-gegevens nodig is. De gebruiker klikt bijvoorbeeld op een knop om zijn of haar historie van geboekte reizen weer te geven, die is opgeslagen in Salesforce.
Stap 16: 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.
Stap 17: Gebruiker 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.
