Fluxo do token de atualização JWT

129

Estou criando um aplicativo móvel e estou usando o JWT para autenticação.

Parece que a melhor maneira de fazer isso é emparelhar o token de acesso JWT com um token de atualização, para que eu possa expirar o token de acesso com a frequência que desejar.

  1. Como é um token de atualização? É uma string aleatória? Essa cadeia é criptografada? É outro JWT?
  2. O token de atualização seria armazenado no banco de dados no modelo de usuário para acesso, correto? Parece que deve ser criptografado neste caso
  3. Eu enviava o token de atualização de volta após o login do usuário e depois o cliente acessava uma rota separada para recuperar um token de acesso?
jtmarmon
fonte
3
Observe que, se você estiver usando tokens de atualização, deverá permitir que os usuários os invalidem na interface do usuário. Também é recomendável expirá-los automaticamente se não forem usados, por exemplo, por um mês.
Vilmantas Baranauskas
1
@ jtmarmon: como você armazena o token de atualização no lado do cliente? Quero dizer o dispositivo Android com segurança?
J10

Respostas:

39

Supondo que se trata do OAuth 2.0, pois trata-se de JWTs e tokens de atualização ...:

  1. Assim como um token de acesso, em princípio um token de atualização pode ser qualquer coisa, incluindo todas as opções que você descreve; uma JWT pode ser usada quando o Servidor de Autorização deseja não ter estado ou deseja impor algum tipo de semântica de "prova de posse" ao cliente que a apresenta; observe que um token de atualização difere de um token de acesso, pois ele não é apresentado a um servidor de recursos, mas apenas ao servidor de autorização que o emitiu em primeiro lugar; portanto, a otimização de validação independente para JWTs como tokens de acesso não segure para tokens de atualização

  2. isso depende da segurança / acesso do banco de dados; se o banco de dados puder ser acessado por outras partes / servidores / aplicativos / usuários, então sim (mas sua milhagem pode variar de acordo com onde e como você armazena a chave de criptografia ...)

  3. um Servidor de Autorização pode emitir tokens de acesso e tokens de atualização ao mesmo tempo, dependendo da concessão usada pelo cliente para obtê-los; a especificação contém os detalhes e as opções de cada um dos subsídios padronizados

Hans Z.
fonte
31
2. Você deve armazenar um hash do token de atualização no seu banco de dados e comparar o hash do token de atualização do usuário com o hash armazenado. A regra "não armazene senhas de texto sem formatação no seu banco de dados" segue aqui. Considere um token como uma senha aleatória que você criou para o usuário.
Rohmer
2
Além disso, se você deseja fornecer mais segurança, também execute a rotação do token de atualização. A importância disso já é mencionada na ITEF RFC 6749 . Se implementado corretamente, isso também pode ajudar a identificar o cenário de roubo de token, ou seja, o token de atualização foi roubado por um invasor. Se você está procurando uma explicação melhor,
acesse
81

Abaixo estão as etapas para revogar seu token de acesso JWT:

  1. Ao fazer login, envie 2 tokens (token de acesso, token de atualização) em resposta ao cliente.
  2. O token de acesso terá menos tempo de validade e a atualização terá um longo prazo de validade.
  3. O cliente (Front end) armazenará o token de atualização em seu armazenamento local e o token de acesso nos cookies.
  4. O cliente usará um token de acesso para chamar APIs. Porém, quando expirar, escolha o token de atualização no armazenamento local e chame a API do servidor de autenticação para obter o novo token.
  5. Seu servidor de autenticação terá uma API exposta que aceitará o token de atualização e verificará sua validade e retornará um novo token de acesso.
  6. Depois que o token de atualização expirar, o Usuário será desconectado.

Informe-me se precisar de mais detalhes. Também posso compartilhar o código (inicialização Java + Spring).

Para suas perguntas:

Q1: é outro JWT com menos solicitações feitas com longo prazo de validade.

P2: Não estará em um banco de dados. O back-end não será armazenado em nenhum lugar. Eles apenas descriptografam o token com chave privada / pública e o validam com seu tempo de expiração também.

Q3: Sim, correto

Bhupinder Singh
fonte
28
Eu acho que o JWT deve ser armazenado localStoragee o refreshTokendeve ser armazenado em um arquivo httpOnly. O refreshToeknpode ser usado para obter um novo JWT, portanto ele deve ser manuseado com cuidado extra.
Tnc Andrei
2
Obrigado, o que você quer dizer com armazenar no httpOnly? Por que não armazenar os dois no localStorage?
Jay
8
Estou perdendo os benefícios de usar o token de atualização, não seria o mesmo para estender a validade do token de acesso?
user2010955
3
@ Jay De acordo com a Microsoft Developer Network, HttpOnly é um sinalizador adicional incluído no cabeçalho de resposta HTTP Set-Cookie. O uso do sinalizador HttpOnly ao gerar um cookie ajuda a reduzir o risco de o script do lado do cliente acessar o cookie protegido (se o navegador suportar).
shadow0359
23
# 2 é altamente impreciso. Um token de atualização TEM QUE ser armazenado no lado do servidor. Você não deve aproveitar a propriedade "independente" do JWT para obter um token de atualização. Fazer isso não permite revogar tokens de atualização além de alterar sua chave privada.
Jai Sharma
26

Com base nesta implementação com o Node.js do JWT com token de atualização :

1) Nesse caso, eles usam um uid e não é um JWT. Quando eles atualizam o token, eles enviam o token de atualização e o usuário. Se você implementá-lo como um JWT, não precisará enviar o usuário, porque ele seria dentro do JWT.

2) Eles implementam isso em um documento separado (tabela). Faz sentido para mim porque um usuário pode fazer login em diferentes aplicativos clientes e pode ter um token de atualização por aplicativo. Se o usuário perder um dispositivo com um aplicativo instalado, o token de atualização desse dispositivo poderá ser invalidado sem afetar os outros dispositivos conectados.

3) Nesta implementação, ele responde ao método de logon com o token de acesso e o token de atualização. Parece correto para mim.

David
fonte
Ao dizer "1) Nesse caso, eles usam um uid ..." você quis dizer UUID?
Ozanmuyes 08/08/19
E sobre essa implementação mais simples - Issue JWT - enviar a JWT mais velho quando você deseja atualizar - (você pode verificar iatcom a janela) - reeditar um novo baseado no anterior
adonese
@ adonese, enviando apenas o que JWTvocê quer ter refresh_tokendentro dela? Se assim for, OAuth RFC 6749 diz explicitamente para não enviar refresh_tokenpara o servidor de recursos (e JWTé enviado para os servidores de recursos): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa