APIs de identidade autônomos: Fluxo de credenciais e código de autorização para clientes públicos
Para clientes públicos, como aplicativos de página única ou aplicativos móveis, você pode configurar o login autônomo para clientes e parceiros usando o Fluxo de credenciais e código de autorização. Esse fluxo é criado no tipo de concessão Código de autorização OAuth 2.0. Com o Fluxo de código e credenciais de autorização, você controla a experiência de login de front-end em um aplicativo de terceiros. Você chama as APIs de login autônomo do Salesforce por meio do seu site do Experience Cloud para lidar com o trabalho de back-end de autenticação de usuários e acesso a recursos protegidos do Salesforce. Com processos separados de front-end e back-end, seus usuários podem fazer login e acessar os dados do Salesforce sem sair do aplicativo. Para aplicativos de página única, use um ponto final de retorno de chamada no lado do servidor para extrair o código de autorização e realize a troca de código do navegador por meio de JavaScript no lado do cliente.
Edições obrigatórias
| Disponível em: Salesforce Classic e Lightning Experience |
| Disponível em: Enterprise, Unlimited e Developer Editions |
Este conteúdo de ajuda descreve como configurar o fluxo e como ele funciona. Para configurar uma implementação de exemplo de ponta a ponta, consulte o Guia de implementação de identidade autônoma.
Antes de configurar esse fluxo, conclua estas etapas.
- Preencha os pré-requisitos da identidade autônoma.
- Integre seu aplicativo fora da plataforma ao Salesforce usando uma destas opções.
Como você gerencia o Salesforce Customer Identity por meio de sites do Experience Cloud, é possível configurar o Fluxo de credenciais e código de autorização somente para clientes e parceiros que usam um subdomínio de site do Experience Cloud, como https://MyExperienceCloudSite.my.site.com. Não é possível configurar esse fluxo para funcionários que acessam a plataforma do Salesforce com login.salesforce.com ou Meu domínio específico da empresa, ou para funcionários que acessam sites do Experience Cloud.
Aqui está um exemplo de caso de uso para o Fluxo de Código e credenciais de autorização. Você trabalha para uma agência de viagens que armazena dados dos clientes no Salesforce. Você criou um aplicativo de página única personalizado e deseja que seus usuários tenham acesso a suas reservas de viagem anteriores no aplicativo. Você também deseja ter controle total sobre a experiência de login para estar alinhado à identidade visual da sua empresa. Então, você configura seu aplicativo personalizado como um aplicativo cliente externo ou aplicativo conectado e configura o Fluxo de Código e credenciais de autorização.
Por padrão, os usuários inserem seu nome de usuário para fazer login. Para dar aos usuários mais opções, configure a descoberta de usuário autônomo. Por exemplo, desenvolva um fluxo em que os usuários insiram seu endereço de email, número de telefone ou até mesmo um número do pedido. Consulte Login autônomo sem um nome de usuário.
Esta é uma visão geral simplificada do fluxo em ação.
- O usuário acessa o aplicativo personalizado, onde o formulário de login é exibido nativamente no aplicativo, e insere o nome de usuário e a senha. Ou, se você estiver usando a descoberta autônoma de usuário, ele inserirá um identificador, como endereço de email, número de telefone ou número do pedido, junto com a senha.
- Se estiver usando a extensão Chave de comprovação para Code Exchange (PKCE), o aplicativo gerará os valores usados para verificar o código de autorização. Se não estiver usando PKCE, seu fluxo pulará essa etapa. Recomendamos que você sempre use o PKCE ao implementar esse fluxo para aplicativos de página única.
- No navegador, seu aplicativo personalizado, por meio de JavaScript, envia uma solicitação de autorização autônoma para o ponto final de autorização da API de Login autônomo do Salesforce no site do Experience Cloud.
- Se você estiver usando a descoberta de usuário autônomo, seu manipulador do Apex encontrará o usuário com base no identificador usado para fazer login. Se as credenciais do usuário forem válidas e o usuário tiver um endereço de email ou número de telefone verificado, o login prosseguirá.
- A API de Login autônomo do Salesforce valida as credenciais do usuário e retorna um redirecionamento HTTP 302 para um URL pré-configurado que contém o código de autorização. Em seguida, o Salesforce envia automaticamente a resposta de redirecionamento para o URL de redirecionamento, que aponta para o manipulador de retorno de chamada no lado do servidor.
- O manipulador de retorno de chamada no lado do servidor extrai o código de autorização do redirecionamento 302 e o retorna ao aplicativo.
- O JavaScript do lado do cliente recebe os parâmetros de URL de redirecionamento e inicia a troca de código com uma solicitação POST para o ponto final do token.
- A API de Login autônomo do Salesforce valida a solicitação e retorna uma resposta de token de acesso ao aplicativo.
- O JavaScript do lado do cliente no aplicativo processa o token de acesso e cria a sessão do usuário.
- Agora, o usuário está conectado e executa uma ação no seu aplicativo personalizado que inicia uma solicitação de dados do Salesforce. Por exemplo, ele clica em um botão para acessar seu histórico de reservas de viagem, que é armazenado no site do Salesforce Experience Cloud.
- O aplicativo personalizado faz uma solicitação autenticada para um ponto final do Salesforce protegido, como uma API do Salesforce.
- Agora, o usuário pode acessar seus dados protegidos em seu aplicativo personalizado. Por exemplo, ele pode ver seu histórico de reservas de viagem.
Um componente-chave desse fluxo é o JavaScript do lado do cliente que envia a solicitação de autorização, realiza a troca de código e processa o token de acesso. Aqui está um exemplo de JavaScript que usa um aplicativo conectado.
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;
}
Outro componente-chave é o manipulador de retorno de chamada no lado do servidor, que extrai o código do redirecionamento 302 e o retorna ao aplicativo. Neste exemplo, o manipulador é uma classe do Apex exposta como um ponto final REST público e o Compartilhamento de recurso entre origens (CORS) está habilitado para oferecer proteção de script entre sites. Para simplificar o desenvolvimento, use o ponto final de eco OAuth 2.0 para obter o código de autorização.
@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;
}
}
}
Aqui está uma análise detalhada desse fluxo.
O usuário final abre o aplicativo de terceiros e faz login
O usuário abre o aplicativo de terceiros para fazer login. No seu aplicativo, seu formulário de login é exibido com campos de nome de usuário e senha e um botão de login. O Salesforce não fornece esse formulário de login. A aparência dele depende de você. O usuário insere o nome de usuário e a senha e clica no botão de login.
O aplicativo de terceiros gera valores de code_verifier e code_challenge (opcional)
Se estiver usando a extensão Chave de comprovação para Code Exchange (PKCE), o aplicativo gerará valores usados para verificar o código de autorização.
Seu fluxo incluirá essa etapa somente se você estiver usando a extensão Chave de comprovação para Code Exchange (PKCE). Como uma prática recomendada de segurança, recomendamos enfaticamente usar a extensão PKCE ao implementar o Fluxo de código e credenciais de autorização, especialmente para aplicativos de página única. Para obter mais informações sobre a PKCE, consulte a especificaçãoRFC 7636: Chave de prova para troca de código por clientes públicos da OAuth fornecida pela Internet Engineering Task Force (IETF).
A especificação PKCE definida em RFC 7636 também inclui um parâmetro code_challenge_method opcional que pode ser enviado na solicitação de autorização. O Salesforce ignora qualquer valor enviado nesse parâmetro e o padrão é SHA256.
O aplicativo de terceiros envia uma solicitação autônoma de código de autorização
No navegador, seu aplicativo personalizado, por meio de JavaScript, envia uma solicitação autônoma de código de autorização para o ponto final de autorização da API de Login autônomo do Salesforce. Se você não estiver usando a descoberta autônoma de usuário, poderá usar o método GET ou POST para essa solicitação. Se você estiver usando a descoberta autônoma de usuário, somente solicitações POST terão suporte.
Neste fragmento de JavaScript no lado do cliente, a solicitação de autorização é enviada como parte da função startLogin. Depois de recuperar as credenciais do usuário, a função cria e envia uma solicitação POST, incluindo um URL de redirecionamento que aponta para o manipulador de retorno de chamada no lado do servidor.
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;
}
Para solicitações GET e POST, é necessário incluir o cabeçalho Auth-Request-Type: Named-User.
Dependendo do método que você usa e da configuração do aplicativo cliente externo ou do aplicativo conectado, às vezes, é necessário incluir um cabeçalho de autorização do tipo Básico contendo as credenciais do usuário. Se estiver usando uma solicitação GET, você deverá enviar as credenciais (nome de usuário e senha do usuário anexados e codificados com Base64) em um cabeçalho de autorização. Veja um exemplo de solicitação GET.
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*******
Se estiver usando uma solicitação POST, poderá incluir as credenciais de usuário com codificação Base64 em um cabeçalho de autorização ou colocar no corpo da solicitação.
Se estiver usando a descoberta autônoma de usuário, você não enviará um nome de usuário e uma senha. Em vez disso, você envia um identificador no parâmetro login_hint, dados personalizados opcionais e uma senha. Inclua o identificador, os dados personalizados e a senha no corpo de uma solicitação POST. Não use uma solicitação GET.
Opcionalmente, para conectar esse fluxo ao fluxo de convidado autônomo, você pode incluir um cabeçalho Uvid-Hint com um token de acesso baseado em JWT com um valor UVID, que é um identificador universalmente exclusivo (UUID) versão 4 gerado e gerenciado totalmente pelo seu aplicativo. Para obter um token de acesso com um UVID, você deve habilitar seu aplicativo cliente externo ou aplicativo conectado para emitir tokens de acesso baseados em JWT e implementar o fluxo de convidado autônomo em seu aplicativo.
Se implementar o fluxo de usuário convidado no seu aplicativo, como opção, você poderá usar esse cabeçalho para passar em um token de acesso baseado em JSON Web Token (JWT) contendo um ID do visitante exclusivo (UVID) vinculado à identidade de um usuário convidado. Ao passar o UVID para um fluxo de usuário nomeado, você pode trazer informações contextuais de uma sessão do usuário convidado, como as preferências de cookies do usuário, para uma sessão do usuário nomeado.
Também é possível incluir o valor simples do UVID no corpo da solicitação.
Para os métodos GET e POST, inclua estes parâmetros obrigatórios no corpo da solicitação de autorização.
| Parâmetro | Descrição |
|---|---|
client_id |
A chave de consumidor do aplicativo cliente externo ou do aplicativo conectado. |
redirect_uri |
O URL para o qual os usuários são redirecionados depois de uma autenticação bem-sucedida. O URI de redirecionamento deve corresponder a um dos valores no campo URL de retorno no aplicativo cliente externo ou no aplicativo conectado. Caso contrário, a aprovação falhará. Para clientes públicos, o URI de redirecionamento deve apontar para um ponto de extremidade que possa processar o redirecionamento 302 do Salesforce. Para simplificar o desenvolvimento, use o ponto final de eco do OAuth, como https://MyExperienceCloudSite.my.site.com/services/oauth2/echo. Estes exemplos usam um ponto de extremidade de extração de código REST do Apex. Por exemplo, |
response_type |
O tipo de concessão do OAuth 2.0 que o aplicativo solicita. Para o Fluxo de credenciais e código de autorização, o valor deve ser code_credentials. |
Você também pode incluir estes parâmetros opcionais na solicitação de autorização.
| Parâmetro | Descrição |
|---|---|
code_challenge |
Obrigatório se estiver usando a extensão PKCE. Especifica o valor de hash SHA256 do valor Esse parâmetro é obrigatório se um
|
scope |
Permissões que definem o tipo de recursos protegidos que o aplicativo pode acessar. Você atribui escopos a um aplicativo cliente externo ou aplicativo conectado ao criá-lo, e eles são incluídos nos tokens OAuth durante o fluxo de autorização. Se você não incluir esse parâmetro, todos os escopos atribuídos ao aplicativo serão solicitados. Para restringir ainda mais os escopos, passe um subconjunto dos escopos atribuídos nesse parâmetro. Para parâmetros válidos, consulte Escopos de OAuth. |
state |
Qualquer estado que o serviço da web externo solicite para ser enviado ao URL de retorno. Esse valor deve ser codificado por URL. |
uvid_hint |
Um valor Em vez de passar o UVID no corpo da solicitação, você também pode passá-lo em um token baseado em JWT com um UVID por meio do cabeçalho |
login_hint |
Obrigatório se estiver usando a descoberta autônoma de usuário. Um identificador que seu manipulador do Apex pode usar para localizar a conta do Salesforce de um usuário. Por exemplo, capture o número do pedido de um usuário no seu aplicativo e passe-o no parâmetro login_hint. Enviamos o valor login_hint diretamente para o manipulador do Apex. |
customdata |
Obrigatório se você estiver usando um manipulador de descoberta autônoma de usuário que lida com dados personalizados. Por exemplo, se você também estiver usando o manipulador com um fluxo de login que lida com dados personalizados, deverá passar dados personalizados no fluxo Esqueci minha senha. Uma string JSON contendo dados adicionais que seu manipulador autônomo de descoberta do Apex usa para localizar a conta do Salesforce de um usuário. Por exemplo, passe informações sobre a localidade do usuário. |
(Opcional) O Manipulador de descoberta autônoma de usuário encontra o usuário
Se você estiver usando um manipulador autônomo de descoberta de usuário, o manipulador pega os parâmetros login_hint e customdata e encontra o usuário associado. O manipulador confirma que o endereço de email ou número de telefone do usuário foi verificado.
Para obter um exemplo de manipulador, consulte Auth.HeadlessUserDiscoveryHandler.
O Salesforce valida as credenciais e retorna um redirecionamento 302 ao manipulador de retorno de chamada no lado do servidor
A API de Login autônomo do Salesforce recebe a solicitação de autorização. Ela valida as credenciais do usuário e retorna um redirecionamento HTTP 302 para um URL pré-configurado que contém o código de autorização. Em seguida, o Salesforce envia automaticamente a resposta de redirecionamento para o URL de redirecionamento, que aponta para o manipulador de retorno de chamada no lado do servidor no ponto de extremidade de /code/extraction, neste exemplo. Durante esse processo, o navegador não é redirecionado, tudo acontece nos bastidores.
O manipulador de retorno de chamada no lado do servidor extrai código e o retorna para o aplicativo
O manipulador de retorno de chamada no lado do servidor extrai o código de autorização e outros dados. O manipulador de retorno de chamada do Apex do exemplo usa o método do doGet para extrair o código, o URL do site do Experience Cloud, o ID do site e o estado do redirecionamento 302.
@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;
}
}
Aqui está outro exemplo de extração de código usando PHP: Hypertext Preprocessor (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);
?>
Após extrair o código, o manipulador de retorno de chamada envia-o de volta para o navegador.
O aplicativo recebe a resposta do código e realiza a troca de códigos
O navegador recebe a resposta de código. Aqui está um exemplo de uma resposta bem-sucedida no log do console do navegador.
{"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*******"}O navegador solicita de modo autônomo a troca do código por um token de acesso. No exemplo de JavaScript no lado do cliente, a função doCodeExchange envia o código em uma solicitação POST para o ponto de extremidade de token do Experience Cloud.
Para evitar a exposição do segredo do consumidor ao navegador, você deve desabilitar as configurações Exigir segredo para fluxo do servidor da Web e Exigir segredo para atualizar o fluxo de tokens em seu aplicativo conectado ou aplicativo cliente externo. Com essas configurações desabilitadas, o segredo do consumidor não é necessário na solicitação de autorização. Se possível, recomendamos realizar a troca de código usando um back-end do servidor. Consulte APIs de identidade autônomos: Fluxo de credenciais e código de autorização para clientes particulares.
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)
}
}
}
Para a solicitação de token de acesso, você pode usar apenas uma solicitação POST. Não há suporte para solicitações GET. Você deve incluir um cabeçalho Content-Type. Inclua estes parâmetros obrigatórios no corpo da solicitação.
| Parâmetro | Descrição |
|---|---|
client_id |
A chave de consumidor do aplicativo cliente externo ou do aplicativo conectado. |
code |
O servidor de autorização cria um código de autorização, que é um token de vida curta, e o passa ao cliente após a autenticação bem-sucedida. O cliente envia o código de autorização ao servidor de autorização para obter um token de acesso e, opcionalmente, um token de atualização. |
grant_type |
O tipo de validação que o aplicativo pode fornecer para comprovar que é um visitante seguro. Para o Fluxo de credenciais e código de autorização, o valor deve ser authorization_code. |
redirect_uri |
O URL para o qual os usuários são redirecionados depois de uma autenticação bem-sucedida. O URI de redirecionamento deve corresponder a um dos valores no campo URL de retorno no aplicativo cliente externo ou no aplicativo conectado. Caso contrário, a aprovação falhará. Para clientes públicos, o URI de redirecionamento deve apontar para um ponto de extremidade que possa processar o redirecionamento 302 do Salesforce. Para simplificar o desenvolvimento, use o ponto final de eco do OAuth, como https://MyExperienceCloudSite.my.site.com/services/oauth2/echo. Estes exemplos usam um ponto de extremidade de extração de código REST do Apex. Por exemplo, |
Você também pode incluir estes parâmetros opcionais na solicitação de token.
| Parâmetro | Descrição |
|---|---|
client_secret |
O segredo do consumidor do aplicativo cliente externo ou do aplicativo conectado. |
code_verifier |
Obrigatório se estiver usando a extensão PKCE. Especifica 128 bytes de dados aleatórios com alta entropia para dificultar adivinhar o valor de
|
format |
O formato esperado da resposta. O Salesforce oferece suporte a estes formatos.
|
O Salesforce concede um token de acesso
Depois de validar as credenciais do aplicativo, a API de Login autônomo do Salesforce retorna um token de acesso para o navegador. Veja aqui um exemplo de resposta de token de acesso no formato JSON.
{
"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"
}
A resposta do token de acesso contém estes parâmetros obrigatórios.
| Parâmetro | Descrição |
|---|---|
access_token
|
Token OAuth que um aplicativo cliente externo ou aplicativo conectado usa para solicitar acesso a um recurso protegido em nome do aplicativo cliente. Permissões adicionais na forma de escopos podem acompanhar o token de acesso. |
id
|
Um URL de identidade que pode ser usado para identificar o usuário e consultar mais informações sobre o usuário. Veja os URLs de identidade. |
instance_url
|
Um URL que indica a instância da organização do usuário. Por exemplo: https://yourInstance.salesforce.com/. |
issued_at
|
Carimbo de data/hora de quando a assinatura foi criada, expresso como o número de milésimos de segundo de 1970-01-01T0:0:0Z UTC. |
signature
|
Assinatura HMAC-SHA256 com codificação Base64 realizada com client_secret. A assinatura pode incluir ID concatenado e issued_at value, que você pode usar para verificar se o URL da identidade não mudou desde que o servidor o enviou. |
sfdc_community_url
|
O URL do site do Experience Cloud. |
sfdc_community_id
|
O ID do site do Experience Cloud do usuário. |
token_type
|
Um tipo de token Bearer, que é usado para todas as respostas que incluem um token de acesso.
|
A resposta do token de acesso também pode incluir estes parâmetros.
| Parâmetro | Descrição |
|---|---|
id_token
|
Uma estrutura de dados assinada que contém atributos de usuário autenticado, incluindo um identificador exclusivo para o usuário e um carimbo de data e hora de quando o token foi emitido. Ele também identifica o aplicativo cliente que faz a solicitação. Consulte Especificações do OpenID Connect. Esse parâmetro será retornado se o parâmetro escopo incluir |
refresh_token
|
Token obtido do servidor da Web, do agente do usuário ou do fluxo do token do aplicativo híbrido. Este valor é secreto. Tome medidas adequadas para protegê-lo. Esse parâmetro é retornado somente se o aplicativo cliente externo ou aplicativo conectado estiver configurado com um escopo refresh_token. |
state
|
O estado solicitado pelo cliente. Esse valor será incluído somente se o parâmetro state estiver na string de consulta original.
|
O aplicativo processa a resposta do token e cria a sessão do usuário
O navegador armazena as informações da resposta do token e cria a sessão do usuário. Nesse ponto, o usuário está conectado e o JavaScript do lado do cliente chama o ponto final de Informações do usuário do Salesforce para confirmar que o login foi bem-sucedido, como mostrado neste fragmento.
// 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";
}
}
}
O usuário final está conectado e executa uma ação no aplicativo
O usuário agora está conectado. Ele executa uma ação no seu aplicativo que requer acesso a dados do Salesforce. Por exemplo, ele clica em um botão para visualizar seu histórico de reservas de viagem, que é armazenado no Salesforce.
O aplicativo faz uma chamada autenticada para um ponto final do Salesforce
Para acessar os dados do Salesforce do usuário, o aplicativo usa o token de acesso para fazer uma chamada autenticada para um ponto de extremidade do Salesforce protegido, como uma API do Salesforce.
O usuário final pode acessar os dados do Salesforce
Agora o cliente pode acessar os dados protegidos do Salesforce em seu aplicativo. Por exemplo, ele pode ver seu histórico de reservas de viagem. Da perspectiva do usuário final, todo o processo, desde o login até o acesso aos dados, ocorreu sem exigir que o usuário saia do aplicativo.
