OAuth et Se connecter avec Sporty

Se connecter avec Sporty

OpenID Connect — l'id_token, ses claims, /userinfo et la vérification d'une signature.

Si vous avez seulement besoin de savoir qui est une personne, il vous faut OpenID Connect, c'est-à-dire le flux du code d'autorisation avec openid dans le scope.

Faites pointer n'importe quelle bibliothèque OIDC vers https://api.sporty.plus/.well-known/openid-configuration et elle se configurera toute seule. Écrire la vérification à la main est possible, mais en vaut rarement la peine.

L'id_token

Renvoyé avec le jeton d'accès lorsque openid a été accordé. Il s'agit d'un JWT RS256 :

{
  "iss": "https://api.sporty.plus",
  "sub": "9f1c2e40-...",
  "aud": "your-client-id",
  "iat": 1789304059,
  "nbf": 1789304059,
  "exp": 1789307659,
  "auth_time": 1789304050,
  "nonce": "what-you-sent",
  "at_hash": "xQ7f...",
  "name": "Ada Lovelace",
  "given_name": "Ada",
  "family_name": "Lovelace",
  "locale": "hr",
  "email": "ada@example.com",
  "email_verified": true
}
ClaimRemarques
subL'identifiant permanent du membre. C'est celui-ci qu'il faut stocker. Il ne change jamais ; une adresse e-mail, si.
audVotre client id. Vérifiez-le.
noncePrésent si vous en avez envoyé un. Vérifiez-le.
at_hashLie cet id_token au jeton d'accès émis avec lui.
auth_timeLe moment où le membre a donné son accord. Pas forcément celui où il s'est connecté — nous ne l'enregistrons pas, ne construisez donc pas de comportement max_age dessus.
name, given_name, family_name, localeUniquement avec profile.
email, email_verifiedUniquement avec email.

Le vérifier

Récupérez https://api.sporty.plus/oauth2/jwks, choisissez la clé dont le kid correspond à l'en-tête du jeton, vérifiez la signature RS256, puis contrôlez iss, aud et exp.

curl https://api.sporty.plus/oauth2/jwks

Mettez le JWKS en cache — une heure est raisonnable — mais récupérez-le à nouveau lorsque vous rencontrez un kid inconnu, plutôt que d'échouer.

/userinfo

Un id_token est un instantané. Pour les valeurs actuelles :

curl https://api.sporty.plus/oauth2/userinfo \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Les mêmes claims, filtrés de la même façon selon le scope, avec toujours sub.

Rotation des clés

Nous renouvelons rarement la clé de signature, et quand nous le faisons :

  • la nouvelle clé publique apparaît dans le JWKS, à côté de l'ancienne, avant que quoi que ce soit ne soit signé avec elle ;
  • tous les jetons d'accès existants cessent de fonctionner. La clé de signature est partagée avec les jetons d'accès, donc une rotation y met fin. Vos jetons de rafraîchissement survivent — utilisez-les, et soyez prêt à redemander l'autorisation si cela échoue.

Si un jeton d'apparence valide est soudain rejeté, rafraîchissez-le une fois avant de supposer que quelque chose est cassé.