Há muitas informações na web sobre o uso de JWT ( Json Web Token
) para autenticação. Mas ainda não encontrei uma explicação clara de como deve ser o fluxo ao usar tokens JWT para uma solução de logon único em um ambiente de vários domínios .
Trabalho para uma empresa que tem muitos sites em hosts diferentes. Vamos usar example1.com e example2.com . Precisamos de uma solução de logon único, o que significa que se um usuário se autentica em example1.com , queremos que ele também seja autenticado em example2.com automaticamente.
Usando o fluxo OpenId Connect , entendo que o usuário que deseja autenticar em example1.com primeiro será redirecionado para o servidor de autenticação (ou OP
: "Provedor OpenId"). O usuário é autenticado nesse servidor, que o redireciona de volta ao site example1.com original com um token JWT assinado. (Eu entendo que há outro fluxo que retorna um token intermediário que pode ser trocado pelo token JWT real mais tarde, mas não acho que isso seja necessário para nós) ...
Agora o usuário está de volta a example1.com e autenticado! Ele pode fazer solicitações, passando o token JWT em um Authentication
cabeçalho e o servidor é capaz de verificar o JWT assinado e, portanto, é capaz de identificar o usuário. Agradável!
Primeira pergunta :
Como o token JWT deve ser armazenado no cliente? Novamente, há muitas informações sobre isso, e as pessoas parecem concordar que usar Web Storage
é o caminho a seguir, e não o bom e velho cookies
. Queremos que o JWT seja persistente entre as reinicializações do navegador, então vamos usar Local Storage
, não Session Storage
...
Agora o usuário pode reiniciar seu navegador e ainda será autenticado em example1.com , contanto que o token JWT não tenha expirado!
Além disso, se example1.com precisa fazer uma solicitação Ajax para outro de nossos domínios, entendo que a configuração do CORS permitiria isso. Mas nosso principal caso de uso não são as solicitações entre domínios, mas sim uma solução de logon único !
Portanto, a questão principal:
Agora, qual deve ser o fluxo, se o usuário for para example2.com e quisermos que ele seja autenticado, usando o token JWT que ele já possui? Local Storage
não parece permitir o acesso entre domínios, portanto, neste ponto, o navegador não consegue ler o token JWT para fazer solicitações a example2.com !
Devemos :
- O usuário será redirecionado para o servidor de autenticação novamente? Quando o usuário autenticou para example1.com , o servidor de autenticação pode ter definido um cookie no usuário para que esta nova solicitação de autenticação para example2.com pudesse usar esse cookie para ver se o usuário já está autenticado e imediatamente redirecioná-lo de volta para example2.com com o mesmo token JWT?
- Ou pode o navegador, em example2.com , acessar o token JWT sem ter que ir para o servidor de autenticação novamente? Vejo que existem soluções de armazenamento cruzado , mas essas são amplamente utilizadas? Eles são a solução sugerida para um ambiente SSO de domínio cruzado?
Não queremos nada extravagante, ficaríamos felizes com a solução mais usada!