Qual é a finalidade de um “Token de atualização”?

110

Eu tenho um programa que se integra com a API de transmissão ao vivo do YouTube. Ele roda em temporizadores, então foi relativamente fácil para mim programar para buscar um novo token de acesso a cada 50 minutos com um token de atualização. Minha pergunta é, por quê?

Quando me autentiquei no YouTube, recebi um token de atualização. Em seguida, uso este token de atualização para obter um novo token de acesso cerca de uma vez por hora. Se eu tiver o token de atualização, posso SEMPRE usá-lo para obter um novo token de acesso, pois ele nunca expira. Portanto, não vejo como isso é mais seguro do que apenas me dar um token de acesso desde o início e não me preocupar com todo o sistema de token de atualização.

Jason Axelrod
fonte
3
Os tokens de acesso são tokens do portador . O que significa que nenhuma outra identificação é necessária e o token de acesso é tudo o que é necessário para se passar por você. Por causa disso, eles devem ter vida curta. Por outro lado, os tokens de atualização não são tokens do portador . Ao enviar um token de atualização para o YouTube para obter um novo token de acesso, você também deve enviar um client_id e client_secret. Por causa disso, o token de atualização pode durar mais tempo porque é muito menos provável que o token de atualização e o client_secret sejam comprometidos.
jrahhali

Respostas:

96

Basicamente, os tokens de atualização são usados ​​para obter um novo token de acesso.

Para diferenciar claramente esses dois tokens e evitar confusão, aqui estão suas funções fornecidas na Estrutura de Autorização OAuth 2.0 :

  • Os tokens de acesso são emitidos para clientes de terceiros por um servidor de autorização com a aprovação do proprietário do recurso. O cliente usa o token de acesso para acessar os recursos protegidos hospedados pelo servidor de recursos.
  • Os tokens de atualização são credenciais usadas para obter tokens de acesso. Os tokens de atualização são emitidos para o cliente pelo servidor de autorização e são usados ​​para obter um novo token de acesso quando o token de acesso atual se torna inválido ou expira, ou para obter tokens de acesso adicionais com escopo idêntico ou mais restrito.

Agora, para responder à sua pergunta sobre por que ainda estava recebendo um token de atualização em vez de apenas proteger um token de acesso, o principal motivo fornecido pela Força-Tarefa de Engenharia da Internet em tokens de atualização é:

Há um motivo de segurança: o refresh_tokené sempre trocado com o servidor de autorização, enquanto o access_tokené trocado com servidores de recursos. Isso atenua o risco de um access_token de longa duração vazar no "um token de acesso válido por uma hora, com um token de atualização válido por um ano ou válido até a revogação" vs "um token de acesso válido até revogado sem atualização símbolo."

Para obter informações mais detalhadas e completas sobre o fluxo do OAuth 2.0, tente consultar as seguintes referências:

Teyam
fonte
5
O token de atualização também deve ajudar a obter um novo token de atualização?
Gherman de
6
Por que não adquirir um novo access_token de curta duração quando ele expirar? Por que ter o refresh_token de longa duração se você precisa solicitar ao servidor um novo access_token de qualquer maneira? Ou é verdade que com um refresh_token eu não preciso manter o cookie do provedor de identidade ativo e ele emite novos access_tokens com base no refresh_token, mesmo depois que o cookie se foi e o usuário teria que inserir suas credenciais se quisesse obter um novo access_token?
JustAMartin de
2
@JustAMartin Como um cliente OAuth2, sem um token de atualização, eu precisaria iniciar todo o fluxo de autorização novamente (fazer o usuário 'fazer login' e me dar permissões novamente), a fim de obter outro token de acesso. Os tokens de atualização contornam esse requisito como uma espécie de 'prova' de que eu, como o cliente, já recebi a permissão do usuário para solicitar um token de acesso.
jrahhali
um token de atualização pode ter dados idênticos ou iguais ao token de acesso? já que o principal uso do token de atualização é para facilitar a experiência do usuário e limitar o tempo de acesso dos hackers a um recurso.
DaviesTobi alex
10

@Teyam menciona a postagem do SO Por que o OAuth v2 tem tokens de acesso e atualização? mas eu prefiro a outra resposta lá: https://stackoverflow.com/a/12885823/254109

TL; DR refresh_token não traz maior segurança. Tem como objetivo melhorar a escalabilidade e o desempenho. Então, access_tokenpode ser armazenado apenas em algum armazenamento temporário rápido (como a memória). Também permite a separação de servidores de autorização e recursos.

xmedeko
fonte
3
exceto que há um motivo de segurança, conforme mencionado por @Teyam: "refresh_token só é trocado com o servidor de autorização, enquanto o access_token é trocado com servidores de recursos"
huyz 01 de
2
Isso só é mais seguro se presumirmos que o servidor de autorização está, de alguma forma, mais protegido como servidor de recursos. Se não for esse o caso, é menos seguro. Se o token de atualização estiver comprometido, posso apenas usá-lo para obter um novo token de acesso.
Arno van Lieshout
TL; DR ?? é realmente ?
Hos Mercury
10

O token de atualização atende a pelo menos dois propósitos. Primeiro, o token de atualização é um tipo de 'prova' de que um cliente OAuth2 recebeu permissão do usuário para acessar seus dados e, portanto, pode solicitar um novo token de acesso novamente sem exigir que o usuário passe por todo o fluxo OAuth2. E, em segundo lugar, ajuda a aumentar todo o fluxo de segurança em comparação com um token de acesso de longa duração. Vou abordar esses dois pontos com mais detalhes.

Atualizar tokens como um meio de não incomodar o usuário

Vamos falar sobre o primeiro propósito com um exemplo. Suponha que você, um usuário, esteja usando um aplicativo da web cliente de terceiros que deseja interagir com os dados de sua conta do YouTube. Depois de conceder permissão ao aplicativo Cliente para usar seus dados do YouTube, você gostaria que o aplicativo Cliente solicitasse sua permissão novamentequando seu token do YouTube expirou? O que acontece se o tempo de expiração do token do YouTube for muito baixo, como 5 minutos. Seria um pouco chato ter o aplicativo do cliente solicitando sua permissão pelo menos a cada 5 minutos! A solução que o OAuth2 propõe para esse 'problema' é atualizar os tokens. Ao usar tokens de atualização, o token de acesso pode permanecer de curta duração (o que é desejável no caso de o token de acesso vazar ou ser roubado de alguma forma), e o token de atualização pode permanecer por muito tempo (er), permitindo que o cliente obtenha um novo acesso token quando um expira sem exigir a permissão do usuário (novamente).

Mas por que um token de atualização? Se o objetivo é não incomodar o usuário com solicitações de permissão, por que o cliente não pode simplesmente dizer "Ei, servidor de autorização, quero outro token de acesso. Agora!"? Ou, "Ei servidor de autorização, aqui está meu token expirado, dê-me um novo!". Bem, o token de atualização serve como uma espécie de "prova" de que o cliente em algum momento original teve acesso concedido por um usuário. Essa "prova" está na forma de token de atualização sendo digitalmente assinado pelo Servidor de Autorização. Ao apresentar um token de atualização pelo Cliente, o Servidor de Autorização pode verificar se o Cliente recebeu, em algum ponto no passado, permissão do Usuário, e o Cliente não precisa solicitar ao Usuário novamente.

Atualizar o token como um meio de aumentar a segurança

No entanto, isso levanta a questão: "Bem, o que acontece se o token de atualização vazar, for roubado ou simplesmente for mantido por um aplicativo cliente malicioso que não se livra dele a pedido do usuário? O invasor não pode simplesmente continuar a usar o token de atualização para obter um token de acesso válido indefinidamente (ou até que expire)? Esta pergunta leva a discutir o segundo propósito que mencionei, de tokens de atualização contribuindo para um fluxo mais seguro.

O problema que surge com os tokens de acesso é que, uma vez adquiridos, eles só são apresentados ao Servidor de Recursos (YouTube, por exemplo). Portanto, se um token de acesso for roubado ou comprometido, como você diz ao Servidor de Recursos para não confiar nesse token? Bem, você não pode realmente. A única maneira de fazer isso seria alterar a chave de assinatura privada no Authorization Server (a chave que assinou o token em primeiro lugar). Imagino que seja inconveniente de fazer e, em alguns casos (como Auth0), não é compatível.

Por outro lado, os tokens de atualização precisam ser apresentados ao servidor de autorização com frequência e, portanto, se algum estiver comprometido, é comum revogar ou negar o token de atualização como um todo e não ter que alterar nenhuma chave de assinatura.

jrahhali
fonte
9

"Então, não vejo como isso é mais seguro do que apenas me dar um token de acesso desde o início e não me preocupar com todo o sistema de token de atualização." Eu lutei com a mesma pergunta. A resposta curta é que o token de atualização é necessário para garantir que as credenciais não tenham expirado.

Um exemplo pode ajudar: tenho um banco de dados que armazena seus registros médicos. Você consente em compartilhar seus registros médicos com seu cônjuge. Seu cônjuge usa o token de acesso para ler seus registros de meu banco de dados. Daqui a duas semanas, seu cônjuge verifica novamente seus registros médicos e o token de atualização é usado para garantir que eles ainda tenham permissão (do servidor de autenticação) para visualizar seus registros. O token de atualização evita a necessidade de seu cônjuge inserir novamente suas credenciais (nome de usuário e senha) no servidor de autenticação, mas garante que eles ainda tenham legitimidade para acessar o recurso. Um token de acesso que nunca expira não saberia se você revogou os direitos de seu cônjuge de acessar seus registros médicos.

Adam Cole
fonte