OAuth 2.1, portées et jetons
Métadonnées de découverte, enregistrement dynamique, PKCE, portées read, write et send, durée de vie des jetons et révocation.
Le serveur suit la spécification d'autorisation MCP : OAuth 2.1 avec PKCE obligatoire, métadonnées de ressource protégée (RFC 9728) et de serveur d'autorisation (RFC 8414), enregistrement dynamique (RFC 7591) et paramètre iss dans la réponse (RFC 9207).
Découverte
GET https://mcp.novadesko.com/.well-known/oauth-protected-resource
GET https://mcp.novadesko.com/.well-known/oauth-authorization-server| Champ | Valeur |
|---|---|
resource | https://mcp.novadesko.com (ou https://mcp.novadesko.com/mcp selon l'adresse appelée) |
issuer | https://mcp.novadesko.com |
authorization_endpoint | https://web.novadesko.com/ai-oauth/authorize |
token_endpoint | https://mcp.novadesko.com/ai-oauth/token |
registration_endpoint | https://mcp.novadesko.com/ai-oauth/register |
revocation_endpoint | https://mcp.novadesko.com/ai-oauth/revoke |
grant_types_supported | authorization_code, refresh_token |
code_challenge_methods_supported | S256 |
token_endpoint_auth_methods_supported | none, client_secret_post, client_secret_basic |
scopes_supported | read, write, send |
authorization_response_iss_parameter_supported | true |
L'écran d'autorisation reste sur web.novadesko.com : il utilise la session Novadesko de l'utilisateur. Un appel sans jeton à https://mcp.novadesko.com renvoie :
HTTP/2 401
www-authenticate: Bearer resource_metadata="https://mcp.novadesko.com/.well-known/oauth-protected-resource", scope="read write send"
Enregistrement dynamique
POST https://mcp.novadesko.com/ai-oauth/register
Content-Type: application/json
{
"client_name": "Mon client MCP",
"redirect_uris": [
"https://client.example/callback"
],
"token_endpoint_auth_method": "none",
"grant_types": [
"authorization_code",
"refresh_token"
],
"response_types": [
"code"
]
}- 1 à 10
redirect_uris, 500 caractères au plus, sans fragment#. - HTTPS obligatoire, sauf
http://localhost,127.0.0.1et[::1]pour les clients locaux. - La réponse contient le
client_id(préfixendcl_). Un secret éventuel est stocké haché (SHA-256).
Portées
| Portée | Écran Novadesko | Outils visibles |
|---|---|---|
read | Consultation (toujours accordée) | get_*, search*, list_*, fetch, cancel_action |
write | Création et modification (facultatif) | les outils prepare_* de portée write + confirm_action |
send | Envoi de mails et SMS (facultatif) | prepare_email, prepare_reminder + confirm_action |
L'utilisateur peut décocher write ou send sur l'écran d'autorisation, quelle que soit la demande du client. tools/list ne renvoie que les outils permis par les portées accordées.
Durée de vie des jetons
| Élément | Durée |
|---|---|
| Code d'autorisation | 10 minutes, usage unique |
| Jeton d'accès | 1 heure |
| Jeton de rafraîchissement | 30 jours, renouvelé à chaque rafraîchissement (rotation) |
Révocation
Le client peut révoquer avec POST https://mcp.novadesko.com/ai-oauth/revoke (RFC 7009). L'utilisateur peut aussi cliquer sur Révoquer dans Novadesko, Intégrations : l'effet est immédiat, le prochain appel reçoit 401. Tous les secrets (jetons, codes) sont stockés hachés, jamais en clair.