Estou começando a trabalhar com a API do Google e o OAuth2. Quando o cliente autoriza meu aplicativo, recebo um "token de atualização" e um "token de acesso" de curta duração. Agora, toda vez que o token de acesso expirar, posso POSTAR meu token de atualização para o Google e eles me fornecerão um novo token de acesso.
Minha pergunta é qual é o objetivo do token de acesso expirando? Por que não pode haver apenas um token de acesso duradouro em vez do token de atualização?
Além disso, o token de atualização expira?
Consulte Usando o OAuth 2.0 para acessar as APIs do Google para obter mais informações sobre o fluxo de trabalho do Google OAuth2.
Alguns cenários podem ajudar a ilustrar a finalidade de acessar e atualizar os tokens e as compensações de engenharia na criação de um sistema oauth2 (ou qualquer outro tipo de autenticação):
Cenário de aplicativo da Web
No cenário de aplicativo da web, você tem algumas opções:
Vamos imaginar que alguém consiga invadir sua sessão. A única coisa possível é solicitar suas páginas.
Comparando 1 e 2:
Em 1, access_token e refresh_token apenas viajam pelo caminho entre o servidor de autorização (google no seu caso) e o servidor de aplicativos. Isso seria feito em um canal seguro. Um hacker pode seqüestrar a sessão, mas ele só poderá interagir com seu aplicativo da web. Em 2, o hacker pode retirar o access_token e formar suas próprias solicitações aos recursos aos quais o usuário concedeu acesso. Mesmo se o hacker se apossar do access_token, ele terá apenas uma pequena janela na qual poderá acessar os recursos.
De qualquer maneira, o refresh_token e o clientid / secret são conhecidos apenas pelo servidor, impossibilitando que o navegador da Web obtenha acesso a longo prazo.
Vamos imaginar que você esteja implementando o oauth2 e defina um tempo limite longo no token de acesso:
1) Não há muita diferença aqui entre um token de acesso curto e longo, pois está oculto no servidor de aplicativos. Em 2) alguém poderia obter o access_token no navegador e usá-lo para acessar diretamente os recursos do usuário por um longo tempo.
Cenário para celular
No celular, existem alguns cenários que eu conheço:
Armazene o ID do cliente / segredo no dispositivo e peça para o dispositivo orquestrar obtendo acesso aos recursos do usuário.
Use um servidor de aplicativos back-end para manter o clientid / segredo e fazer a orquestração. Use o access_token como um tipo de chave de sessão e passe-o entre o cliente e o servidor de aplicativos.
Comparando 1 e 2
1) Depois de ter clientid / secret no dispositivo, eles não são mais secretos. Qualquer um pode descompilar e começar a agir como se fosse você, com a permissão do usuário, é claro. O access_token e refresh_token também estão na memória e podem ser acessados em um dispositivo comprometido, o que significa que alguém pode atuar como seu aplicativo sem que o usuário dê suas credenciais. Nesse cenário, o comprimento do access_token não faz diferença para a hackabilidade, pois refresh_token está no mesmo local que access_token. Em 2) o clientid / secret nem o token de atualização estão comprometidos. Aqui, a duração da expiração access_token determina por quanto tempo um hacker pode acessar os recursos dos usuários, caso eles se apossem dele.
Comprimentos de validade
Aqui, depende do que você está protegendo com seu sistema de autenticação e quanto tempo deve durar sua expiração de access_token. Se é algo particularmente valioso para o usuário, deve ser curto. Algo menos valioso, pode ser mais longo.
Algumas pessoas como o google não expiram o refresh_token. Alguns como o stackflow fazem. A decisão sobre a expiração é uma troca entre facilidade e segurança do usuário. O comprimento do token de atualização está relacionado ao tamanho do retorno do usuário, ou seja, defina a atualização com a frequência com que o usuário retornará ao seu aplicativo. Se o token de atualização não expirar, a única maneira de revogá-lo é com uma revogação explícita. Normalmente, um logon não seria revogado.
Espero que um post mais longo seja útil.
fonte
Além das outras respostas:
Uma vez obtidos, os Tokens de Acesso geralmente são enviados junto com todas as solicitações dos Clientes para os Servidores de Recursos protegidos. Isso induz um risco de roubo e reprodução de tokens de acesso (supondo que os tokens de acesso sejam do tipo "Portador" (conforme definido no RFC6750 inicial).
Exemplos desses riscos, na vida real:
Os servidores de recursos geralmente são servidores de aplicativos distribuídos e geralmente têm níveis mais baixos de segurança em comparação com os servidores de autorização (menor configuração SSL / TLS, menos proteção, etc.). Os servidores de autorização, por outro lado, são geralmente considerados uma infraestrutura de segurança crítica e estão sujeitos a um reforço mais severo.
Os tokens de acesso podem aparecer em rastreamentos HTTP, logs etc. coletados legitimamente para fins de diagnóstico nos servidores ou clientes de recursos. Esses traços podem ser trocados por locais públicos ou semi-públicos (rastreadores de bugs, service desk, etc.).
Os aplicativos de back-end RS podem ser terceirizados para terceiros mais ou menos confiáveis.
O token de atualização, por outro lado, normalmente é transmitido apenas duas vezes pelos fios, e sempre entre o cliente e o servidor de autorização: uma vez quando obtido pelo cliente e uma vez quando usado pelo cliente durante a atualização ("expirando" efetivamente a atualização anterior) símbolo). Esta é uma oportunidade drasticamente limitada para interceptação e reprodução.
Por último, os Refresh Tokens oferecem muito pouca proteção, se houver, contra clientes comprometidos.
fonte
É essencialmente uma medida de segurança. Se o seu aplicativo estiver comprometido, o invasor terá acesso apenas ao token de acesso de curta duração e não terá como gerar um novo.
Os tokens de atualização também expiram, mas devem durar muito mais tempo que o token de acesso.
fonte