OAuth 2.0 para aplicativos de primeira parte: Fluxo de nome de usuário autônomo – senha para clientes particulares
Para configurar o login de nome de usuário e senha para um aplicativo fora da plataforma desenvolvido pela sua empresa, use esse fluxo de login de nome de usuário e senha autônomo, que implementa o protocolo padrão de rascunho OAuth 2.0 para aplicativos de primeira parte. Com esse fluxo, você pode controlar totalmente a experiência de login de front-end em seu aplicativo de primeira parte enquanto o Salesforce lida com o trabalho de back-end de autenticação de usuários e conceder acesso a recursos protegidos. Esse fluxo tem suporte apenas para clientes privados, como aplicativos cliente-servidor, e tem suporte apenas para usuários externos
Edições obrigatórias
| Disponível em: Salesforce Classic e Lightning Experience |
| Disponível em: Enterprise, Unlimited e Developer Editions |
Para configurar o login de nome de usuário autônomo e senha para um cliente privado, você também pode usar essa versão do Fluxo de credenciais e código de autorização, que implementa APIs de identidade autônoma. Ambos os fluxos realizam o mesmo caso de uso: login de nome de usuário autônomo e senha para um aplicativo fora da Salesforce Platform. Porém, há algumas diferenças importantes a serem consideradas.
| OAuth para aplicativos de primeira parte | APIS de identidade autônoma |
|---|---|
| Suportado apenas para clientes privados. | Suportado para clientes públicos e privados. |
| Está em conformidade com o protocolo de rascunho OAuth 2.0 para solicitações de primeira parte. | Fluxo proprietário do Salesforce criado com base no padrão OAuth 2.0. |
| Suportado apenas para a estrutura de aplicativo cliente externo do Salesforce. Além disso, a única maneira de definir as configurações do aplicativo cliente externo para esse fluxo é por meio da API de metadados. | Suportado tanto para o aplicativo cliente externo do Salesforce quanto para estruturas de aplicativo conectado. |
| Por segurança, esse fluxo sempre requer um JWT de atestado do cliente. O Salesforce usa o JWT de atestado do cliente para validar se o aplicativo foi desenvolvido pela sua empresa. | Para segurança, requer autenticação ou reCAPTCHA, mas não JWT de atestado do cliente. |
Antes de configurar esse fluxo, conclua estas etapas.
- Preencha os pré-requisitos da identidade autônoma.
- Gere um JWT de atestado do cliente.
- Configure um aplicativo cliente externo do Salesforce.
- Configurar as configurações do Experience Cloud.
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 de como o fluxo funciona.
- Etapa 1: um usuário final acessa seu aplicativo de primeira parte e faz login usando seu nome de usuário e 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.
- Etapa 2: seu aplicativo de primeira parte define um JWT de atestado do cliente e gera parâmetros para a extensão Chave de comprovação para troca de código (PKCE).
- Etapa 3: para obter um código de autorização, seu aplicativo de primeira parte envia uma solicitação POST autônoma para o ponto de extremidade services/oauth2/v1/authorization_challenge em seu site do Experience Cloud. A solicitação inclui um JWT de atestado do cliente junto com as credenciais do usuário.
- Etapa 4: para confirmar que seu aplicativo de primeira parte enviou a solicitação, o Salesforce valida o JWT de atestado do cliente e, em seguida, valida os outros parâmetros.
- (Opcional) Se você estiver usando a descoberta de usuário autônomo, seu manipulador do Apex localizará 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á.
- Etapa 5: se a solicitação for bem-sucedida, o Salesforce retornará um código de autorização.
- Etapa 6: para trocar o código por um token de acesso, seu aplicativo de primeira parte envia uma solicitação ao ponto de extremidade /services/oauth2/token.
- Etapa 7: o Salesforce retorna uma resposta de token contendo o token de acesso.
- Etapa 8: seu aplicativo de primeira parte processa o token de acesso e cria a sessão do usuário.
- Etapa 9: o usuário final agora está conectado e executa uma ação em seu aplicativo que requer acesso a um recurso protegido do Salesforce.
- Etapa 10: seu aplicativo de primeira parte faz uma chamada autenticada para uma API do Salesforce.
- Etapa 11: o usuário agora pode acessar seus dados do Salesforce em seu aplicativo de primeira parte.
Etapa 1: o usuário final abre o aplicativo de primeira parte e faz login
Um usuário final abre seu aplicativo de primeira parte com a intenção de fazer login. No aplicativo, seu formulário de login aparece mostrando 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.
Etapa 2: O aplicativo de primeira parte cria um JWT de atestado do cliente e gera valores de code_verifier e code_challenge
O aplicativo lembra um JWT de atestado do cliente.
O aplicativo também gera valores para os parâmetros de PKCE usados para verificar o código de autorização.
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.
Etapa 3: o aplicativo de primeira parte solicita um código de autorização autônomo
No navegador, seu aplicativo envia as credenciais do usuário, juntamente com outros parâmetros, para o ponto de extremidade services/oauth2/v1/authorization_challenge em seu site do Experience Cloud por meio de uma solicitação POST autônoma.
Não há cabeçalhos obrigatórios para essa solicitação. 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 contendo um valor de ID de visitante exclusivo (UVID).
| Cabeçalho | Obrigatório? | Descrição |
|---|---|---|
Uvid-Hint
|
Não. Se você implementar o fluxo de usuário convidado no seu aplicativo, como opção, poderá usar esse cabeçalho para passar em um token de acesso baseado em JWT contendo um ID do visitante exclusivo (UVID) vinculado à identidade de um usuário convidado. Ao passar o Em vez de passar um token baseado em JWT com um |
Um token de acesso baseado em JWT contendo um valor UVID, que é um identificador universalmente exclusivo (UUID) versão 4 gerado e gerenciado inteiramente 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. |
Inclua estes parâmetros no corpo da solicitação.
| Parâmetro | Obrigatório? | Descrição |
|---|---|---|
code_challenge
|
Obrigatório se você exigisse a PKCE para seu aplicativo cliente externo. Para que os recursos de segurança desse fluxo funcionem corretamente, recomendamos enfaticamente que você sempre exija a PKCE. | Especifica o valor de hash SHA256 do valor Se Se |
username
|
Sim. | O nome de usuário que o usuário enviou ao seu formulário de login. |
client_id
|
Sim. | A chave de consumidor do aplicativo cliente externo. |
password
|
Sim. | A senha que o usuário enviou ao seu formulário de login. |
client_assertion
|
Sim. | O JWT de atestado do cliente que você gerou, assinado pelo certificado configurado para seu aplicativo cliente externo. |
recaptcha
|
Obrigatório se estas condições se aplicam a você:
|
Um token criptografado emitido pela API reCAPTCHA do Google quando um usuário conclui um desafio de reCAPTCHA. |
recaptchaevent
|
Obrigatório se estas condições se aplicam a você:
|
Um objeto JSON contendo estes subparâmetros.
Para obter mais informações, consulte a documentação do Google reCAPTCHA. |
scope
|
Não. | Permissões que definem o tipo de recursos protegidos que o aplicativo cliente externo pode acessar. Você atribui escopos ao aplicativo cliente externo ao criá-lo, e eles são incluídos nos tokens OAuth durante o fluxo de autorização. Use esse parâmetro para solicitar um subconjunto dos escopos atribuídos ao seu aplicativo cliente externo. Se você não incluir esse parâmetro, todos os escopos atribuídos ao aplicativo são solicitados |
uvid_hint
|
Não. Se você implementar o fluxo de usuário convidado no seu aplicativo, poderá usar como opção esse parâmetro para passar em um valor do Em vez de passar o |
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
|
Necessário se você estiver usando um manipulador do Apex de descoberta de usuário autônomo. | 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. Caso contrário, é opcional, mas pode ser útil para ajudar seu manipulador a localizar o usuário. |
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. |
Aqui está um exemplo de solicitação para o ponto final de desafio de autorização.
POST /services/oauth2/v1/authorization_challenge? HTTP 1.1
Host: MyExperienceCloudSite.my.site.com
username=janice.edwards@example.com&
password=*****&
client_assertion=******&
recaptcha=********&
scope=profile&
code_challenge=********
Etapa 4: o Salesforce valida a solicitação
O Salesforce primeiro tenta validar o JWT de atestado do cliente validando se a assinatura passada no parâmetro client_asssertion corresponde à assinatura do certificado configurado para o aplicativo cliente externo.
Se o JWT de atestado do cliente não for válido, o Salesforce retornará um erro invalid_attestation e você deverá reenviar a solicitação com todos os parâmetros enviados originalmente. Aqui está um exemplo de resposta de erro.
HTTP/1.1 403 Forbidden
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_attestation",
"error_code": "client_attestation_failed"
}
Se o JWT de atestado do cliente for válido, mas houver outros problemas com a solicitação, o Salesforce retornará uma resposta de erro especificando o que estava errado com a solicitação. Aqui está um exemplo de resposta que será retornada se o usuário enviar o nome de usuário ou senha incorreto.
HTTP/1.1 403 Forbidden
Content-Type: application/json
Cache-Control: no-store
{
"error": "authorization_required",
"auth_session": "uY29tL2F1d*****",
"error_code": "invalid_credentials"
}A resposta inclui um parâmetro auth_session que permanece válido por 5 minutos após ser emitido. Durante o período em que a auth_session é válida, você pode usá-la para reenviar a solicitação. Nas versões corrigidas que você reenvia, inclua apenas os valores corrigidos para os parâmetros que causaram a falha da solicitação. Você também deve reenviar a password a cada solicitação, pois o Salesforce não a armazena. Porém, para outros parâmetros, se eles não causarem a falha da solicitação, você poderá ignorá-los. O Salesforce já sabe que você enviou esses parâmetros porque eles estão vinculados à auth_session.
auth_session, mas você pode reenviar a solicitação sem eles, a menos que causem a falha da solicitação.Aqui estão alguns exemplos de cenários de erro comuns. Essa lista não é abrangente.
- O usuário enviou o nome de usuário ou senha incorreto. Reenvie a solicitação apenas com
username,passwordeauth_session. - O token reCAPTCHA estava incorreto. Reenvie a solicitação apenas com o token reCAPTCHA,
password,eauth_session.
Após 5 minutos a contar do momento em que a sessão de autenticação foi emitida, ela não funciona mais e você recebe um erro auth_session_invalid. Nesse caso, reenvie a solicitação completa com todos os parâmetros que você incluiu originalmente.
(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 pegará os parâmetros login_hint e customdata e encontrará 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.
Etapa 5: o Salesforce retorna um código de autorização
Quando sua solicitação para o ponto de extremidade de desafio de autorização é bem-sucedida, seja na primeira tentativa ou após várias tentativas com a auth_session, o Salesforce retorna um código de autorização. Aqui está um exemplo de uma resposta de código de autorização bem-sucedida.
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
{
"authorization_code": "uY29tL2F1d******"
}Etapa 6: seu aplicativo troca o código de autorização para um token de acesso
Depois de obter o código de autorização, seu aplicativo envia uma solicitação ao ponto de extremidade services/oauth2/token.
Essa solicitação não tem cabeçalhos. Inclua estes parâmetros no corpo da solicitação.
| Parâmetro | Obrigatório? | Descrição |
|---|---|---|
code
|
Sim. | 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. |
client_id
|
Sim. | A chave de consumidor do aplicativo cliente externo. |
client_secret
|
Sim. | O segredo do consumidor do aplicativo cliente externo. Nesse fluxo, ele atua como uma senha que o aplicativo usa para acessar o Salesforce. |
redirect_uri
|
Sim. | 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 do aplicativo cliente externo. Caso contrário, a aprovação falhará. Esse valor deve ser codificado por URL. |
grant_type
|
Sim. | O tipo de validação que o aplicativo pode fornecer para comprovar que é um visitante seguro. Para esse fluxo, o valor deve ser authorization_code. |
code_verifier
|
Obrigatório se você exigisse a PKCE para seu aplicativo cliente externo. Para que os recursos de segurança desse fluxo funcionem corretamente, recomendamos enfaticamente que você sempre exija a PKCE. | Especifica 128 bytes de dados aleatórios com alta entropia para dificultar adivinhar o valor do código. Defina esse parâmetro para ajudar a prevenir ataques de interceptação de código de autorização. O valor deve estar codificado com base64url conforme definido em https://datatracker.ietf.org/doc/html/rfc4648#section-5. Se houver um valor Se o valor |
Aqui está um exemplo de solicitação de token.
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=*******Etapa 7: o Salesforce concede um token de acesso
Depois de validar as credenciais do aplicativo. O Salesforce retorna um token de acesso. 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.
| Parâmetro | Obrigatório? | Descrição |
|---|---|---|
access_token
|
Sim. | Token OAuth que um aplicativo cliente externo 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
|
Sim. | 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. |
id_token
|
Não. | 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. Ela também identifica o aplicativo que faz a solicitação. Consulte Especificações do OpenID Connect. |
instance_url
|
Sim. | Um URL que indica a instância da organização do usuário. Por exemplo, https://yourInstance.salesforce.com/. |
issued_at
|
Sim. | Um 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. |
refresh_token
|
Não. | 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. |
signature
|
Sim. | Assinatura HMAC-SHA256 com codificação Base64 realizada com client_secret. A assinatura pode incluir ID concatenado e valor issued_at, que você pode usar para verificar se o URL da identidade não mudou desde que o servidor o enviou. |
sfdc_community_url
|
Sim. | O URL do site do Experience Cloud. |
sfdc_community_id
|
Sim. | O ID do site do Experience Cloud do usuário. |
state
|
Não. | O estado solicitado pelo cliente. Esse valor será incluído somente se o parâmetro state estiver na string de consulta original. |
token_type
|
Sim. | Um tipo de token Bearer, que é usado para todas as respostas que incluem um token de acesso. |
Etapa 8: o aplicativo cria a sessão do usuário
O aplicativo recebe a resposta de token de acesso e cria a sessão do usuário.
Etapa 9: o usuário está conectado e executa uma ação no aplicativo
Agora, o usuário está conectado e executa uma ação no seu aplicativo que solicita o acesso a dados do Salesforce. Por exemplo, ele clica em um botão para visualizar seu histórico de pedido, que é armazenado no Salesforce.
Etapa 10: o aplicativo faz uma chamada autenticada para um ponto de extremidade 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 final do Salesforce protegido, como uma API do Salesforce.
Etapa 11: o usuário pode acessar 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 pedidos. Da perspectiva do usuário, todo o processo, desde o login até o acesso aos dados, ocorreu sem exigir que o usuário saísse do aplicativo.
