OAuth 2.0 é quem define um protocolo, ou seja, especifica como os tokens são transferidos, o JWT define apenas um formato de token. Mas "autenticação JWT" não é um padrão e não especifica como o Cliente obtém o token em primeiro lugar (o primeiro estágio). É daí que vem a complexidade percebida do OAuth: ele também define várias maneiras pelas quais o Cliente pode obter um token de acesso de algo chamado Servidor de Autorização. Portanto, a diferença real é que o JWT é apenas um formato de token, e o OAuth 2.0 é um protocolo (que pode usar um JWT como um formato de token).
O fluxo é basicamente:
- Os clientes efetuam login enviando suas credenciais ao provedor de identidade.
- O provedor de identidade verifica as credenciais; se tudo estiver OK, ele recupera os dados do usuário, gera um JWT contendo detalhes do usuário e permissões que serão usadas para acessar os serviços e também define a expiração no JWT (que pode ser ilimitada).
- O provedor de identidade assina e, se necessário, criptografa o JWT e o envia ao cliente como uma resposta à solicitação inicial com credenciais.
- O cliente armazena o JWT por um período de tempo limitado ou ilimitado, dependendo da expiração definida pelo provedor de identidade.
- O cliente envia o JWT armazenado em um cabeçalho de autorização para cada solicitação ao provedor de serviços.
- Para cada solicitação, o provedor de serviços pega o JWT do cabeçalho Authorization e o descriptografa, se necessário, valida a assinatura e, se tudo estiver OK, extrai os dados e as permissões do usuário. Com base apenas nesses dados, e novamente sem procurar mais detalhes no banco de dados ou entrar em contato com o provedor de identidade, ele pode aceitar ou negar a solicitação do cliente. O único requisito é que a identidade e os provedores de serviço tenham um acordo sobre criptografia para que o serviço possa verificar a assinatura ou até mesmo descriptografar qual identidade foi criptografada.