web-dev-qa-db-fra.com

Quelle est l'intention de l'heure d'expiration du jeton ID dans OpenID Connect?

Dans OpenID Connect, un jeton d'accès a une heure d'expiration. Pour le flux de code d'autorisation, il s'agit généralement d'une courte durée (par exemple 20 minutes) après laquelle vous utilisez le jeton d'actualisation pour demander un nouveau jeton d'accès.

Le jeton ID a également un délai d'expiration. Ma question est quelle est l'intention de ceci?

Tout délai d’expiration du jeton d’identification inférieur au délai d’expiration du jeton d’actualisation signifie que vous obtiendrez éventuellement un jeton d’identification expiré, mais un jeton d’accès valide.

Alors, êtes-vous censé:

  • donnez à votre jeton d'identité une expiration plus longue que celle du jeton d'actualisation, ou
  • définissez-le à la même expiration que le jeton d'accès et prenez des mesures (quoi?) à l'expiration, ou
  • consommez simplement le jeton d'identification de votre client lors de la réception, puis ignorez le délai d'expiration après cela?

Le spécification OpenID Connect indique simplement que lors de la validation d'un jeton d'identification,

"The current time MUST be before the time represented by the exp Claim."

qui supporte (éventuellement) la troisième option ci-dessus.


[~ # ~] éditer [~ # ~]

Comme OpenID Connect repose sur OAuth2, la réponse à la question complémentaire ci-dessous se trouve dans spécification OAuth2 qui dit:

expires_in
     RECOMMENDED.  The lifetime in seconds of the access token.

Une question connexe concerne le moment où vous échangez un code d'autorisation pour les jetons. La même spécification indique que vous pourriez obtenir une réponse telle que:

{
 "access_token": "SlAV32hkKG",
 "token_type": "Bearer",
 "refresh_token": "8xLOxBtZp8",
 "expires_in": 3600,
 "id_token": "eyJhbG[...]"
}

Mais à quoi "expires_in" se rapporte-t-il dans ce cas? Le jeton d'accès, le jeton d'actualisation ou le jeton d'identification?

(Pour information, IdentityServer définit comme heure d'expiration du jeton d'accès).

75
Appetere

Je réponds à ma propre question après avoir découvert que certaines des hypothèses sur lesquelles reposait ma question étaient erronées. Il est donc plus facile de clarifier la situation ici plutôt que de reformuler la question.

Un jeton d'identification sert à prouver à un client que l'utilisateur s'est authentifié et qui il est en conséquence.

Lorsqu'un client reçoit un jeton d'identification, il le convertit généralement en un identifiant de réclamation et le persiste, par exemple en utilisant un cookie.

Le jeton d'identification doit être non expiré à ce point d'utilisation (ce qui devrait être le cas, car il vient d'être émis). Mais après cela, il n'est plus utilisé, donc peu importe si elle expire tant que l'utilisateur a toujours une session active. Le client dispose des informations d'authentification dont il a besoin et peut à son tour choisir sa propre stratégie pendant combien de temps la session dure avant que l'utilisateur n'ait à se reconnecter.

Ma fausse hypothèse en posant la question était qu’un jeton d’identité et un jeton d’accès devaient être utilisés ensemble, et que, par conséquent, les deux devaient avoir une date d’expiration valide. Ceci est faux pour diverses raisons:

  • Les jetons d'identification servent uniquement à l'authentification auprès d'un client (comme décrit ci-dessus).
  • Les jetons d'accès n'ont rien à voir avec les clients. Ils servent à l’accès aux ressources et un client ne les gère que s’il doit à son tour appeler une ressource.
  • Quelque chose comme une application MVC ou WebForms autonome uniquement nécessite un jeton d'identification. S'il n'appelle pas une ressource externe, il n'y a aucune autorisation d'accès, donc aucun jeton d'accès.
69
Appetere

Je devais creuser cela pour mes propres raisons et l'écrire, alors je vais poster ce que j'ai appris ici ...

Tout d'abord, je vais répondre à la question au risque de poser l'évidence: le jeton d'identification ne peut pas être approuvé et son contenu doit être ignoré si l'heure actuelle est supérieure à l'heure expirée. La réponse du demandeur indique qu'après l'authentification initiale de l'utilisateur, le jeton d'identification n'est plus utilisé. Cependant, étant donné que le jeton d’identité est signé par le fournisseur d’identité, il peut certainement être utile à tout moment pour permettre de déterminer de manière fiable qui est le destinataire. l'utilisateur est associé à d'autres services qu'une application peut utiliser. L'utilisation d'un simple ID utilisateur ou d'une adresse électronique n'est pas fiable car elle peut facilement être usurpée (n'importe qui peut envoyer une adresse électronique ou un ID utilisateur), mais étant donné qu'un jeton d'identifiant OIDC est signé par le Le serveur d'autorisation (qui a généralement l'avantage d'être un tiers) ne peut pas être usurpé et constitue un mécanisme d'authentification beaucoup plus fiable.

Par exemple, une application mobile peut vouloir pouvoir dire à un service backend qui est l'utilisateur qui utilise l'application et peut avoir besoin de le faire après la brève période suivant l'authentification initiale. , à ce moment, le jeton d’ID est expiré et ne peut donc pas être utilisé pour authentifier de manière fiable l’utilisateur.

Par conséquent, tout comme le jeton d'accès (utilisé pour l'autorisation - spécifiant les autorisations de l'utilisateur)) peut être actualisé, pouvez actualiser l'identifiant ID (utilisé pour l'authentification - spécifiant qui l'utilisateur est)? Selon la spécification OIDC, la réponse n’est pas évidente. Dans OIDC/OAuth, il existe trois "flux" pour obtenir des jetons, le flux de code d'autorisation, le flux implicite et le flux hybride (que je vais ignorer ci-dessous car il s'agit d'une variante des deux autres).

Pour le flux implicite dans OIDC/OAuth , vous demandez le jeton ID sur le noeud final d'autorisation en redirigeant l'utilisateur du navigateur vers le noeud final Authorization et en incluant id_token comme valeur du response_type paramètre de demande. Une réponse d'authentification réussie du flux implicite est OBLIGATOIRE pour inclure le id_token.

Pour le flux de code d'authentification , le client spécifie code en tant que valeur du response_type paramètre de demande lors de la redirection de l'utilisateur vers le noeud final d'autorisation. Une réponse réussie inclut un code d'autorisation. Le client client adresse une demande au noeud final de jeton avec le code d'autorisation et, conformément à la section OIDC Core, section 3.1.3.3 Réponse de jeton réussie, la réponse DOIT inclure un jeton d'identification .

Donc, pour l’un ou l’autre flux, c’est ainsi que vous obtenez initialement le jeton d’identification, mais comment l’actualisez-vous? OIDC Section 12: Utilisation des jetons d'actualisation contient l'instruction suivante concernant la réponse du jeton d'actualisation:

Lorsque la validation du jeton d'actualisation est réussie, le corps de la réponse est celui de la réponse du jeton de la section 3.1.3.3, sauf que il pourrait ne pas contenir id_token .

Il pourrait ne pas contenir un jeton d’identifiant et, comme il n’existe aucun moyen de le forcer à inclure le jeton d’identification, vous devez supposer que la réponse ne contiendra pas le jeton d'identification. Donc, techniquement, il n’existe aucun moyen spécifié d’actualiser un jeton d’identité à l’aide d’un jeton d’actualisation. Par conséquent, le seul moyen d'obtenir un nouveau jeton d'identification est de réautoriser/authentifier l'utilisateur en le redirigeant vers le point de terminaison d'autorisation et en démarrant le processus implicite. flux ou code d'authentification comme décrit ci-dessus. La spécification OIDC ajoute un paramètre de requête Prompt à la demande d'autorisation afin que le client puisse demander que le serveur d'autorisation ne soit pas invité. l'utilisateur avec n'importe quelle interface utilisateur, mais la redirection doit encore se produire.

27
Scott Willeke

C'est la même intention: vous ne pouvez pas utiliser le id_token après son expiration. La principale différence est qu'un id_token est une structure de données et vous n'avez pas besoin d'appeler des serveurs ou des points d'extrémité, car les informations sont codées dans le jeton lui-même. Un habitué access_token est généralement un artefact opaque (comme un GUID).

Le consommateur du id_token doit toujours en vérifier la validité (dans le temps).

Je ne connais pas à 100% IS, mais je suppose que c'est un domaine de commodité. Vous devriez toujours vérifier la réclamation exp.

L'expiration n'est que l'une des validations. id_tokens sont également signés numériquement et c’est également une validation que vous devez effectuer.

5
Eugenio Pace

Si je comprends bien, conformément à this et à la spécification OpenID Connect Core 1. , le jeton d'identification lui-même peut être stocké dans des cookies en tant que mécanisme permettant de conserver des sessions, et envoyé avec chaque demande d'authentification au client. Le client peut ensuite vérifier le jeton d’identification soit localement, soit via le noeud final du vérificateur du fournisseur (le cas échéant, comme le fait Google ). Si le jeton a expiré, il devrait faire une autre demande d'authentification, sauf que cette fois avec Prompt=none dans le paramètre d'URL. Assurez-vous également d’envoyer le jeton d’identification expiré dans le fichier id_token_hint paramètre, sinon le fournisseur peut renvoyer une erreur.

Donc, il semble naturel que le jeton d’identité expire, mais Prompt=none s'assure que le nouveau jeton d'identification peut être obtenu facilement, sans intervention de l'utilisateur (à moins bien sûr que l'utilisateur soit déconnecté de cet OpenID).

5
Morrowless

TLDR;

Validez le jeton d'identification avant de faire confiance à ce qu'il dit.

Plus de détails

Quelle est l'intention de l'heure d'expiration du jeton d'identité dans OpenID Connect?

L'intention est de permettre au client de valider le jeton d'identification. Le client doit valider le jeton d'identification avant les opérations utilisant les informations du jeton d'identification .

De spécification du flux implicite OpenID :

Si l’une des procédures de validation définies dans ce document échoue, toute opération nécessitant des informations qui n’ont pas été validées correctement DOIT être annulée et les informations qui n’ont pas été validées NE DOIVENT PAS être utilisées.

Pour corroborer cela, documentation de Google sur OpenID Connect dit ceci à propos de la validation du jeton d'ID:

Une chose qui rend les clés d’identité utiles est le fait que vous pouvez les transmettre à différents composants de votre application. Ces composants peuvent utiliser un jeton d'identification en tant que mécanisme d'authentification léger authentifiant l'application et l'utilisateur. Mais avant de pouvoir utiliser les informations contenues dans le jeton ID ou de vous en servir comme assertion que l'utilisateur s'est authentifié, vous devez le valider.

Ainsi, si notre application client doit prendre des mesures en fonction du contenu du jeton d'identification, nous devons à nouveau valider le jeton d'identification.

4
Shaun Luttin

Actualiser un jeton signifie que vous pouvez l'utiliser à nouveau pour demander quelque chose au serveur d'autorisation (dans ce cas, l'OP - le fournisseur OpenID-Connect) MÊME QUAND L'UTILISATEUR IS NON CONNUÉ. Vous avez généralement n'autorisez cela que pour des ressources limitées, et seulement après que l'utilisateur se soit connecté et authentifié au moins une fois.

Dans OIDC flux implicite , vous appelez le noeud final Autorisation,
et recevez le jeton ID dans la réponse avec toutes les portées et toutes les informations de réclamation.
Les appels suivants à une API doivent être effectués avec le flux de code .
Le flux implicite est conçu pour activer une application javascript uniquement ou par navigateur. Pas une application qui interagit avec un serveur.
Ainsi, même s’il existait un moyen de "rafraîchir" ce jeton, vous ne devriez pas, du point de vue de la sécurité, le laisser vivre trop longtemps. Il sera volé et réutilisé par des utilisateurs non autorisés qui se font passer pour l'identifiant. Vous devriez forcer une nouvelle connexion pour cela.

Dans flux de code , vous appelez le point de terminaison Autorisation de l'OP et vous recevez un Code d'autorisation (également appelé jeton d'autorisation, ou authcode en abrégé). Celui-ci devrait expirer de la même manière que l'id_token que vous avez reçu dans un flux implicite, pour les mêmes raisons et ne peut ni ne doit être renouvelé.

Votre interface utilisateur ou votre application appelle ensuite le point de terminaison Token de l'OP, et reçoit (parfois après que l'utilisateur lui a donné son accord via une interface utilisateur pour autoriser l'utilisation de leurs ressources propres sur le serveur de l'OP):

  • Un id_token, pour l'authentification - qui ne devrait plus jamais être utilisé dans les appels de serveur, sauf comme un indice lors de la déconnexion, lorsque son expiration n'est plus importante et que, pour les raisons susmentionnées, il convient de laisser expirer et de ne jamais être actualisé.
  • Un access_token - qui, plus tard, lors de l'appel d'une API, peut être attribué au point de terminaison UserInfo de l'OP. Cela retournera les revendications et l'API pourra autoriser en conséquence.

Vous pouvez actualiser this access_token, car il indique uniquement à l'API ce que l'utilisateur prétend avoir et quelles ressources (par étendues et par revendications de chaque étendue) qu'il a accepté de vous donner. Comme expliqué ci-dessus, il s'agit de permettre l'accès même après que l'utilisateur n'est plus connecté. Bien entendu, vous ne souhaitez jamais autoriser l'actualisation de id_token, car vous ne souhaitez pas autoriser l'emprunt d'identité sans vous connecter.

4
pashute

Je voulais poster cette réponse en tant que commentaire, mais comme je ne suis pas très actif sur StackOverflow, je suppose que je la poste en tant que réponse alternative.

Vous utilisez également id_token Comme id_token_hint Lorsque vous essayez de déconnecter l'utilisateur d'une session http://openid.net/specs/openid-connect-session-1_0.html . Honnêtement, je ne pense pas que ce qui compte vraiment si le id_token Est expiré, car vous ne vous souciez que de déconnecter un utilisateur en particulier.

3
dgonee