No OpenID Connect, um token de acesso tem um tempo de expiração. Para o fluxo do código de autorização, isso normalmente é curto (por exemplo, 20 minutos) após o qual você usa o token de atualização para solicitar um novo token de acesso.
O token de ID também tem um tempo de expiração. Minha pergunta é qual é a intenção disso?
Qualquer tempo de expiração do token de ID menor que o tempo de expiração do token de atualização significará que você eventualmente terá um token de ID expirado, mas um token de acesso válido.
Então você deve:
- dar ao seu token de ID uma expiração mais longa do que a expiração do token de atualização, ou
- configure-o com a mesma expiração do token de acesso e execute alguma ação (o quê?) quando ele expirar, ou
- basta consumir o token de ID em seu cliente no recebimento e ignorar o tempo de expiração depois disso?
A especificação OpenID Connect apenas diz que, ao validar um token de ID,
"The current time MUST be before the time represented by the exp Claim."
que (possivelmente) suporta a terceira opção acima.
EDITAR
Como o OpenID Connect se baseia no OAuth2, a resposta à pergunta complementar abaixo pode ser encontrada na especificação OAuth2 que diz:
expires_in
RECOMMENDED. The lifetime in seconds of the access token.
Uma questão relacionada é quando você troca um código de autorização para os tokens, a mesma especificação diz que você pode obter uma resposta como:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbG[...]"
}
Mas com o que "expires_in" se relaciona neste caso? O token de acesso, o token de atualização ou o token de ID?
(Para obter informações, IdentityServer3 define isso para o tempo de expiração do token de acesso).
fonte
Eu tive que cavar nisso por meus próprios motivos e escrevi, então vou postar o que aprendi aqui ...
Em primeiro lugar, responderei à pergunta correndo o risco de afirmar o óbvio: o token de ID não é confiável e seu conteúdo deve ser ignorado se o tempo atual for maior que o tempo expirado. A resposta do questionador afirma que, após a autenticação inicial do usuário, o token de identificação não é usado novamente. No entanto, como o token de identificação é assinado pelo provedor de identidade, certamente pode ser útil a qualquer momento fornecer uma maneira confiável de determinar quem é o usuário para outros serviços que um aplicativo possa estar usando. Usar um simples ID de usuário ou endereço de e-mail não é confiável porque pode ser facilmente falsificado (qualquer pessoa pode enviar um endereço de e-mail ou ID de usuário), mas uma vez que um token de ID OIDC é assinado pelo servidor de autorização (que geralmente também tem a vantagem de ser um terceiro), não pode ser falsificado e é um mecanismo de autenticação muito mais confiável.
Por exemplo, um aplicativo móvel pode querer dizer a um serviço de back-end quem é o usuário que está usando o aplicativo e pode precisar fazer isso após o breve período após a autenticação inicial, momento em que o token de ID expira, e, portanto, não pode ser usado para autenticar o usuário de forma confiável.
Portanto, assim como o token de acesso (usado para autorização - especificando quais permissões o usuário tem) pode ser atualizado, você pode atualizar o token de ID (usado para autenticação - especificando quem é o usuário)? De acordo com a especificação OIDC, a resposta não é óbvia. No OIDC / OAuth, há três "fluxos" para obter tokens, o fluxo do Código de autorização, o fluxo Implícito e o fluxo Híbrido (que ignorarei abaixo porque é uma variante dos outros dois).
Para o fluxo implícito em OIDC / OAuth, você solicita o token de ID no terminal de autorização redirecionando o usuário no navegador para o terminal de autorização e incluindo
id_token
o valor doresponse_type
parâmetro de solicitação. Uma resposta de autenticação bem-sucedida de fluxo implícito é NECESSÁRIA para incluir oid_token
.Para o fluxo do Código de autenticação , o cliente especifica
code
como o valor doresponse_type
parâmetro de solicitação ao redirecionar o usuário para o terminal de autorização. Uma resposta bem-sucedida inclui um código de autorização. O cliente cliente faz uma solicitação ao terminal de token com o código de autorização e, de acordo com o OIDC Core Seção 3.1.3.3 Resposta de Token com Sucesso, a resposta DEVE incluir um Token de ID .Portanto, para qualquer um dos fluxos, é assim que você obtém inicialmente o token de ID, mas como você o atualiza? A seção 12 do OIDC: Usando tokens de atualização contém a seguinte declaração sobre a resposta do token de atualização:
Ele pode não conter um token de ID e, como não há nenhuma maneira especificada de forçá-lo a incluir o token de ID, você deve presumir que a resposta não conterá o token de ID. Portanto, tecnicamente, não há uma maneira especificada de "atualizar" um token de ID usando um token de atualização. Portanto, a única maneira de obter um novo token de ID é reautorizar / autenticar o usuário redirecionando-o para o terminal de autorização e iniciando o fluxo implícito ou o fluxo de código de autenticação conforme descrito acima. A especificação OIDC adiciona um
prompt
parâmetro de solicitação à solicitação de autorização para que o cliente possa solicitar que o servidor de autorização não solicite ao usuário nenhuma IU, mas o redirecionamento ainda precisa acontecer.fonte
Se bem entendi, de acordo com esta e as especificações do OpenID Connect Core 1.0 , o próprio token de ID pode ser armazenado em cookies como um mecanismo para persistir as sessões e enviado com cada solicitação de autenticação que exige ao Cliente. O cliente pode então verificar o token de ID localmente ou por meio do ponto de extremidade do verificador do provedor (se fornecido, como o Google faz ). Se o token estiver expirado, ele deve fazer outra solicitação de autenticação, mas desta vez com
prompt=none
no parâmetro URL. Certifique-se também de enviar o token de ID expirado noid_token_hint
parâmetro, caso contrário, o Provedor pode retornar um erro.Portanto, parece natural que o token de ID expire, mas
prompt=none
garante que o novo token de ID possa ser obtido sem intervenção do usuário (a menos, é claro, que o usuário seja desconectado desse OpenID).fonte
É a mesma intenção: você não pode usar o
id_token
depois que ele expirar. A principal diferença é queid_token
é uma estrutura de dados e você não precisa chamar nenhum servidor ou endpoint, pois a informação é codificada no próprio token. Um regularaccess_token
é geralmente um artefato opaco (como um GUID).O consumidor do
id_token
deve sempre verificar a (tempo) validade do mesmo.Não estou 100% familiarizado com IS, mas acho que é um campo de conveniência. Você deve sempre verificar a
exp
reclamação.fonte
Atualizar um token significa que você pode usá-lo novamente para solicitar algo do servidor de autorização (neste caso o OP - o provedor OpenID-Connect) MESMO QUANDO O USUÁRIO NÃO ESTIVER LOGADO. Normalmente, você permite isso apenas para recursos limitados e somente depois que o usuário fizer login e ser autenticado pelo menos uma vez. Os próprios tokens de atualização também devem ser limitados no tempo.
No fluxo implícito OIDC , você chama o endpoint de autorização
e recebe o token de ID na resposta junto com todos os escopos e neles todas as informações de declarações.
As chamadas subsequentes para uma API devem ser feitas com fluxo de código .
O fluxo implícito destina-se a habilitar um aplicativo somente javascript ou somente navegador Não é um aplicativo que está interagindo com um servidor.
Portanto, mesmo que haja uma maneira de "atualizar" esse token, você não deve - em termos de segurança - deixá-lo durar muito tempo. Ele será roubado e reutilizado por usuários não autorizados que se fazem passar pelo id. Você deve forçar um novo login para isso.
No fluxo de código, você chama o endpoint de autorização do OP e recebe um código de autorização (também chamado de token de autorização, ou authcode abreviadamente). Isso deve expirar de forma semelhante ao id_token que você recebeu no fluxo implícito, pelos mesmos motivos e não pode e não deve ser renovado.
Sua IU ou aplicativo, em seguida, chama o endpoint de Token do OP e recebe (às vezes após o consentimento do usuário por meio de uma IU para permitir o uso de seus recursos de propriedade no servidor do OP):
Você pode atualizar este access_token, uma vez que ele informa à API quais declarações o usuário possui e quais recursos (por escopos e as declarações de cada escopo) o usuário concordou em fornecer a você. Conforme explicado acima, isso é para permitir o acesso mesmo depois que o usuário não estiver mais logado. Claro que você nunca deseja permitir que o id_token seja atualizado, porque você não quer permitir a representação sem fazer login.
fonte
Eu queria postar esta resposta como um comentário, mas como não tenho sido muito ativo no StackOverflow, acho que estou postando como uma resposta alternativa.
Você também pode usar
id_token
comoid_token_hint
ao tentar desconectar o usuário de uma sessão http://openid.net/specs/openid-connect-session-1_0.html . Sinceramente, não acho que realmente importe se oid_token
tiver expirado neste ponto, já que você só está preocupado em desconectar um usuário específico.fonte
TLDR;
Valide o token de ID antes de confiar no que ele diz.
Mais detalhes
A intenção é permitir que o cliente valide o token de ID, e o cliente deve validar o token de ID antes das operações que usam as informações do token de ID .
Nas especificações de fluxo implícito do OpenID :
Para corroborar isso, a documentação do OpenID Connect do Google diz o seguinte sobre a validação do token de ID:
Portanto, se nosso aplicativo cliente vai realizar alguma ação com base no conteúdo do token de ID, devemos validar novamente o token de ID.
fonte