Estou criando uma API RESTful que usa tokens JWT para autenticação do usuário (emitidos por um login
nó de extremidade e enviados em todos os cabeçalhos posteriormente), e os tokens precisam ser atualizados após um período fixo de tempo (invocando um renew
nó de extremidade, que retorna um token renovado )
É possível que a sessão da API de um usuário se torne inválida antes que o token expire, portanto, todos os meus pontos de extremidade começam verificando: 1) o token ainda é válido e 2) a sessão do usuário ainda é válida. Não há como invalidar diretamente o token, porque os clientes o armazenam localmente.
Portanto, todos os meus pontos de extremidade precisam sinalizar para meus clientes duas condições possíveis: 1) que é hora de renovar o token ou 2) que a sessão se tornou inválida e que eles não têm mais permissão para acessar o sistema. Posso pensar em duas alternativas para meus pontos de extremidade sinalizarem seus clientes quando uma das duas condições ocorrer (suponha que os clientes possam ser adaptados a qualquer uma das opções):
- Retorne um código http 401 (não autorizado) se a sessão se tornar inválida ou retorne um código 412 (falha na pré-condição) quando o token expirar e for hora de chamar o
renew
terminal, que retornará um código 200 (ok). - Retorne 401 para sinalizar que a sessão é inválida ou que o token expirou. Nesse caso, o cliente chamará imediatamente o
renew
terminal, se retornar 200, o token será atualizado, mas serenew
também retornar 401, significa que o cliente está fora do sistema.
Qual das duas alternativas acima você recomendaria? Qual deles seria mais padrão, mais simples de entender e / ou mais RESTful? Ou você recomendaria uma abordagem completamente diferente? Você vê algum problema óbvio ou risco à segurança com qualquer uma das opções? Pontos extras se sua resposta incluir referências externas que apóiam sua opinião.
ATUALIZAR
Pessoal, por favor, concentrem-se na questão real - qual das duas alternativas de código http para sinalizar uma invalidação de renovação / sessão é a melhor? Não se importe com o fato de meu sistema usar sessões JWT e do lado do servidor, essa é uma peculiaridade da minha API para regras de negócios muito específicas, e não a parte para a qual estou procurando ajuda;)