OAuth et Se connecter avec Sporty

MCP et clients IA

L'enregistrement dynamique des clients, et ce qu'un client auto-enregistré peut et ne peut pas faire.

Un agent qui se connecte à Sporty n'a aucun humain sous la main pour remplir d'abord un formulaire d'enregistrement ; Sporty prend donc en charge l'enregistrement dynamique des clients selon la RFC 7591. Un client s'enregistre lui-même, puis suit le flux du code d'autorisation habituel.

L'enregistrement dynamique n'est pas activé dans tous les environnements. S'il est désactivé, vous obtenez 403 access_denied, et la solution consiste alors à utiliser un client enregistré par un administrateur de club.

S'enregistrer

curl -X POST https://api.sporty.plus/oauth2/register \
  -H 'Content-Type: application/json' \
  -d '{
    "client_name": "My Agent",
    "redirect_uris": ["http://127.0.0.1:8976/callback"],
    "client_uri": "https://myagent.example",
    "contacts": ["you@example.com"]
  }'
{
  "client_id": "01a09ad5-1469-7260-8157-bba3655a2fdf",
  "client_id_issued_at": 1789304059,
  "client_name": "My Agent",
  "redirect_uris": ["http://127.0.0.1:8976/callback"],
  "grant_types": ["authorization_code", "refresh_token"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none",
  "scope": "openid profile email me.read me.reservations.read"
}

Il n'y a pas de client_secret : un client auto-enregistré est public, et c'est PKCE qui le protège. Les URI de redirection de bouclage (loopback) sont autorisées précisément pour ce cas, et le port est ignoré lors de la comparaison.

La découverte pour un client OAuth classique se trouve à https://api.sporty.plus/.well-known/oauth-authorization-server, et la ressource que vous cherchez à atteindre est décrite à /.well-known/oauth-protected-resource.

Les limites d'un client auto-enregistré

Tout cela est délibéré, et rien n'est négociable au cas par cas :

  • Public et PKCE uniquement. Il n'existe aucun secret susceptible de fuiter.
  • authorization_code et refresh_token uniquement. Jamais client_credentials — un agent n'agit jamais sans membre présent.
  • openid, profile, email et me.* uniquement. Il ne peut jamais demander les données d'un club. Une intégration qui a besoin de club.* doit être enregistrée par un administrateur de club. Tous les scopes me.* sont disponibles (sur /me) :
    • le profil du membre ;
    • ses réservations, ainsi que la réservation ou l'annulation d'un court pour lui ;
    • ses résultats de matchs ;
    • ses clubs et ses adhésions.

    Un agent qui réserve pour un membre doit lui montrer le prix. Lorsque needs_payment vaut true, il doit lui indiquer qu'il paie dans l'application Sporty.
  • Le consentement n'est jamais ignoré, même pour un membre qui l'a déjà donné.
  • Des jetons de courte durée — quinze minutes, renouvelables pendant une journée.
  • Un enregistrement limité en fréquence, quelques-uns par heure et par adresse.

En attente d'examen

Un client auto-enregistré est en attente, et un client en attente fonctionne uniquement pour le compte qui l'a enregistré.

C'est ce qui rend l'enregistrement ouvert sûr plutôt qu'inquiétant : vous pouvez développer et tester tout le flux immédiatement, et tant que nous n'avons pas examiné votre application, aucun autre compte ne lui est accessible. Le membre est également informé, sur l'écran de consentement, que l'application n'a pas été examinée.

Lorsque vous voulez la rendre accessible à d'autres personnes, contactez-nous. L'examen est une conversation sur ce que fait votre agent et sur les scopes dont il a réellement besoin, pas un formulaire.