Skip to content

OAuth ​

Les routes sont relatives à <PUBLIC_BASE_URL> ; les corps de requête et de réponse sont en JSON sauf mention contraire. L’authentification, les portées, la pagination et le format des erreurs sont décrits dans les guides de l’API REST.

GET /api/v1/admin/oauth-apps/{provider} ​

Décrire une application OAuth

Rend l’URL de callback et les scopes même sans application enregistrée : ce dont l’administrateur a besoin pour la créer dans la console du fournisseur. Jamais le secret, seulement un repère de quatre caractères.

Accès — Session de membre ou clé d’API portant admin:read (rôle administrateur requis).

Paramètres

NomOùTypeRequis
providercheminstringoui

Réponses

200 — L’état de l’application.

ChampTypeRequis
provider"google" | "microsoft"oui
configuredbooleanoui
clientIdstring | nulloui
hasSecretbooleanoui
clientSecretHintstring | nulloui
status"active" | "disabled" | nulloui
redirectUristring (uri)oui
scopesstring[]oui
scopesByCapabilityobjectoui
clientIdPatternstringoui
clientIdHintstringoui
updatedAtstring (date-time) | nulloui
Schéma JSON
json
{
  "type": "object",
  "properties": {
    "provider": { "type": "string", "enum": [ "google", "microsoft" ] },
    "configured": { "type": "boolean" },
    "clientId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
    "hasSecret": { "type": "boolean" },
    "clientSecretHint": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
    "status": {
      "anyOf": [
        { "type": "string", "enum": [ "active", "disabled" ] },
        { "type": "null" }
      ]
    },
    "redirectUri": { "type": "string", "format": "uri" },
    "scopes": { "type": "array", "items": { "type": "string" } },
    "scopesByCapability": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "enum": [ "mail", "drive", "calendar", "sheets", "files", "sharepoint" ]
      },
      "additionalProperties": { "type": "array", "items": { "type": "string" } }
    },
    "clientIdPattern": { "type": "string", "minLength": 1 },
    "clientIdHint": { "type": "string", "minLength": 1 },
    "updatedAt": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        { "type": "null" }
      ]
    }
  },
  "required": [
    "provider",
    "configured",
    "clientId",
    "hasSecret",
    "clientSecretHint",
    "status",
    "redirectUri",
    "scopes",
    "scopesByCapability",
    "clientIdPattern",
    "clientIdHint",
    "updatedAt"
  ],
  "additionalProperties": false
}

401 — Aucune session ni clé d’API valide (auth.unauthenticated).

403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).

429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.

Codes d’erreur — oauth.unsupported_provider. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.

PUT /api/v1/admin/oauth-apps/{provider} ​

Enregistrer une application OAuth

Le secret client entre ici et n’en ressort jamais. Refusé quand l’instance n’a pas de clé de chiffrement. L’identifiant client est vérifié contre la forme attendue par le fournisseur. Journalisé dans l’audit (identifiant client seulement).

Accès — Session de membre ou clé d’API portant admin:write (rôle administrateur requis).

Paramètres

NomOùTypeRequis
providercheminstringoui

Corps de la requête (application/json)

ChampTypeRequis
clientIdstringoui
clientSecretstringoui
status"active" | "disabled"non
Schéma JSON
json
{
  "type": "object",
  "properties": {
    "clientId": { "type": "string", "minLength": 1, "maxLength": 512 },
    "clientSecret": { "type": "string", "minLength": 1, "maxLength": 512 },
    "status": { "type": "string", "enum": [ "active", "disabled" ] }
  },
  "required": [ "clientId", "clientSecret" ]
}

Réponses

200 — L’état de l’application.

ChampTypeRequis
provider"google" | "microsoft"oui
configuredbooleanoui
clientIdstring | nulloui
hasSecretbooleanoui
clientSecretHintstring | nulloui
status"active" | "disabled" | nulloui
redirectUristring (uri)oui
scopesstring[]oui
scopesByCapabilityobjectoui
clientIdPatternstringoui
clientIdHintstringoui
updatedAtstring (date-time) | nulloui

Même schéma que GET /api/v1/admin/oauth-apps/{provider}.

400 — La requête ne respecte pas son schéma.

401 — Aucune session ni clé d’API valide (auth.unauthenticated).

403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).

429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.

Codes d’erreur — oauth.unsupported_provider, oauth.encryption_disabled, request.bad_request, oauth.invalid_client_id. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.

POST /api/v1/oauth/{provider}/start ​

Démarrer une connexion OAuth

Rend l’URL d’autorisation vers laquelle envoyer le navigateur. Le corps ne nomme que la capacité (mail par défaut) ; scopes et redirection viennent de l’instance. Exige une application enregistrée pour le fournisseur.

Accès — Session de membre seulement : les clés d’API sont refusées (api_key.session_required).

Paramètres

NomOùTypeRequis
providercheminstringoui

Corps de la requête (application/json)

ChampTypeRequis
capability"mail" | "drive" | "calendar" | "sheets" | "files" | "sharepoint"non
Schéma JSON
json
{
  "type": "object",
  "properties": {
    "capability": {
      "type": "string",
      "enum": [ "mail", "drive", "calendar", "sheets", "files", "sharepoint" ]
    }
  }
}

Réponses

200 — L’URL d’autorisation et son expiration.

ChampTypeRequis
authorizationUrlstring (uri)oui
expiresAtstring (date-time)oui
Schéma JSON
json
{
  "type": "object",
  "properties": {
    "authorizationUrl": { "type": "string", "format": "uri" },
    "expiresAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [ "authorizationUrl", "expiresAt" ],
  "additionalProperties": false
}

400 — La requête ne respecte pas son schéma.

401 — Aucune session ni clé d’API valide (auth.unauthenticated).

403 — Refusé : rôle insuffisant (auth.forbidden), portée manquante (api_key.scope_missing, details.required la nomme) ou route fermée aux clés (api_key.session_required).

429 — La clé d’API dépasse son débit (api_key.rate_limited) ; Retry-After dit quand réessayer.

Codes d’erreur — oauth.unsupported_provider, request.bad_request, oauth.app_not_configured, oauth.capability_not_supported, oauth.encryption_disabled. Les codes communs (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) s’appliquent à toutes les routes ; voir Erreurs.