Redirecionamento para página específica após login

Bom dia,

Quando eu não estou autenticado no domínio da experience page e tento fazer o login o acessando diretamente por uma página específica, não consigo fazer a autenticação e ser redirecionado à página. Por exemplo:
Ao tentar acessar a rota abaixo, sem estar autenticado, sou redirecionado à página de login:
image
image

Ao submeter o formulário, aparece a seguinte resposta, pois ainda não criei o endpoint de POST para esta página:

image

Até tentei criar o endpoint POST da página e incluir o “endpoint node” no workflow de login, mas o máximo que consegui foi obter a autenticação apenas para a página em questão, e não à experience como um todo:

Como posso fazer para que quando acessar qualquer página sem estar autenticado, redirecionar para o login, autenticar na aplicação inteira, e ser redirecionado novamente para a página que foi tentado acessar inicialmente?

Agradeço desde já e fico a disposição se precisar de mais informações.

Boa noite @linhares,

Então, quando uma rota privada, que tem o controle de acesso configurado como “Any authenticated user”, há dois comportamentos possíveis:

  1. Uma resposta para usuários autenticados.
  2. Um resposta para usuários não autenticados.

Para o seu caso, quando um usuário tenta acessar uma rota, que carrega uma página, e não está autenticado, você pode configurar um redirecionamento para a página de login, junto com a rota original como parâmetro (query). Isso pode ser feito da seguinte forma:
{5B43334A-7EBE-4F43-9C28-D57A4050E5CC}

/login?redirect={{encodeURIComponent request.path}}%3F{{encodeURIComponent (queryStringEncode request.query)}}

Esse redirecionamento leva o usuário para a rota de login, com a rota original como parâmetro, permitindo que, após o login, ele seja redirecionado para a página de origem.

Isso poderia ser feito em todas as rotas com autenticação, mas para não ter que fazer isso em todas as rotas autenticadas que retornam uma página, você pode configurar isso a nível global da versão, conforme descrito na documentação Unauthorized Replies - Experience Versions, levando em conta que isso irá alterar a resposta padrão de todos os endpoints que possuem autorização configurada, e no caso não seria retornado mais o objeto { "error": "Authorization Required" } nas respostas quando o usuário não está autenticado, o que pode afetar o comportamento de serviços, que esperam um JSON como resposta.

Além disso, no fluxo de POST da página de login (Endpoint /login), você deve adicionar uma lógica para considerar o parâmetro “redirect” que foi passado durante a tentativa de login. Você pode fazer isso adicionando o seguinte código, no bloco de Endpoint: Reply (Set cookie) desse flow:
{BEAF1672-FB8F-4744-A295-E9A6569F9E1C}

{{{defaultTo data.query.redirect '/'}}}

Isso garante que, após a autenticação, o usuário será redirecionado para a página de origem ou para a página principal ("/") se nenhum parâmetro “redirect” for informado.


Mas pelo que parece, você também implementou um modal na página que é exibido quando o usuário não está autenticado. Uma possibilidade, se você está fazendo o envio do formulário diretamente da página, o caminho pode ser passado na propriedade “action” do formulário. Isso evita a necessidade de redirecionar o usuário para a página de login, por exemplo:

<form action="/login?redirect={{encodeURIComponent request.path}}%3F{{encodeURIComponent (queryStringEncode request.query)}}" method="POST">
  <!-- campos do formulário -->
</form>

Por fim, pra explicar o comportamento que você descreveu, em que a autenticação estava funcionando somente para a página em questão e não ao experience como um todo, isso se deve a
um detalhe sobre o comportamento dos cookies, considerando o Path no escopo de um cookie (Cookies HTTP). Quando você usa o bloco “Endpoint: Reply” com a função “Set Cookie”, sem um caminho específico, faz com que ele seja aplicado apenas em níveis específicos da rota. Por exemplo, se a requisição foi para /dashboard/device/abcd123, o cookie será setado em /dashboard/device, enquanto que no caminho /login o cookie é setado em / e por isso funciona para toda a aplicação.

Além disso, é possível definir um “Path Template” no bloco de resposta, garantindo que o cookie seja aplicado em um caminho especifico, no caso /, independente da rota que está sendo chamada, garantindo que seja acessivel em todas as rotas da aplicação.
{B3DE87B5-AB5C-4818-B09F-255F12E9C63C}

Espero ter ajudado, e que as explicações auxiliem nesse caso.

1 Curtida

Bom dia! Muito obrigado pelo esclarecimento, sua explicação ficou bem clara e consegui obter o comportamento que eu queria.

Alterei o redirecionamento padrão da versão, porém com um pequeno ajuste para os retornos de API:

{{#match request.path '/api/.*'}}/api/unauthenticated{{else}}/login?redirect={{encodeURIComponent request.path}}%3F{{encodeURIComponent (queryStringEncode request.query)}}{{/match}}

Então criei uma página específica para manter a resposta padrão para API quando não autenticado:


image
image