Sign-in is set up from the console, and a directory tried before it is kept

People → Sign-in shows single sign-on, Active Directory and SCIM, and
the directory's last sync. E sets up Entra ID from the tenant and client
IDs; D sets up Active Directory, tried from the control plane first:
each server bound, people who may sign in, members of each mapped group.
The secrets go into the store as store:auth/..., sealed by the master
key, and the CA into the settings, so no control plane needs a file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ilker ManapandClaude Opus 5.5 committed 2026-10-19 12:55:27 +02:00
1 parent 4b6b3eeddb
commit ac25a9136a
24 files changed
+1753 -18

No files matched your search

+279
View File
@@ -23,6 +23,9 @@
{
"name": "audit"
},
{
"name": "auth"
},
{
"name": "canaries"
},
@@ -226,6 +229,129 @@
}
}
},
"/api/v1/auth": {
"get": {
"operationId": "getAuth",
"summary": "How people sign in: OIDC, a directory, SCIM, and the directory's last sync",
"tags": [
"auth"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthView"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/api/v1/auth/ldap/test": {
"post": {
"operationId": "postAuthLdapTest",
"summary": "Try an auth.ldap block before it is kept: servers, the service account, people and groups",
"tags": [
"auth"
],
"parameters": [
{
"$ref": "#/components/parameters/Actor"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LDAPTestRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LDAPTestView"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/api/v1/auth/secrets/{name}": {
"put": {
"operationId": "putAuthSecretsName",
"summary": "Keep ldap-bind, oidc-client-secret or scim-token in the store, for settings to name as store:auth/NAME",
"tags": [
"auth"
],
"parameters": [
{
"name": "name",
"in": "path",
"required": true,
"description": "ldap-bind, oidc-client-secret or scim-token.",
"schema": {
"type": "string"
}
},
{
"$ref": "#/components/parameters/Actor"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SecretRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/api/v1/canaries": {
"get": {
"operationId": "getCanaries",
@@ -5351,6 +5477,31 @@
}
}
},
"AuthView": {
"type": "object",
"description": "AuthView is how people sign in on this gateway.",
"properties": {
"signup_open": {
"type": "boolean"
},
"oidc": {
"$ref": "#/components/schemas/OIDCView",
"description": "OIDC is single sign-on through an identity provider: Entra ID, Keycloak, Okta."
},
"ldap": {
"$ref": "#/components/schemas/LDAPView",
"description": "LDAP is sign-in checked by a directory: Active Directory."
},
"scim": {
"type": "boolean",
"description": "SCIM is whether a provider may keep accounts in step."
},
"base_url": {
"type": "string",
"description": "BaseURL is the portal's address, when the settings say it: what a provider's redirect address is made from."
}
}
},
"CanaryPercentRequest": {
"type": "object",
"description": "CanaryPercentRequest changes the share of a model's requests its canary takes.",
@@ -5421,6 +5572,21 @@
}
}
},
"CheckView": {
"type": "object",
"description": "CheckView is one step of trying a directory.",
"properties": {
"step": {
"type": "string"
},
"ok": {
"type": "boolean"
},
"detail": {
"type": "string"
}
}
},
"ClassGPUs": {
"type": "object",
"description": "ClassGPUs is how many of a node's devices are of one class, and how many of those are free or kept out of placement.",
@@ -5573,6 +5739,34 @@
}
}
},
"DirectorySyncView": {
"type": "object",
"description": "DirectorySyncView is the last time the leader read the directory.",
"properties": {
"at": {
"type": "string",
"format": "date-time"
},
"people": {
"type": "integer"
},
"accounts": {
"type": "integer"
},
"suspended": {
"type": "integer"
},
"reinstated": {
"type": "integer"
},
"roles_changed": {
"type": "integer"
},
"error": {
"type": "string"
}
}
},
"DomainView": {
"type": "object",
"description": "DomainView is one domain: its nodes, its power and whether it is held.",
@@ -6826,6 +7020,61 @@
}
}
},
"LDAPTestRequest": {
"type": "object",
"description": "LDAPTestRequest is an auth.ldap block to try, as YAML, and the service account's password when it is not kept yet.",
"properties": {
"settings": {
"type": "string"
},
"password": {
"type": "string"
}
}
},
"LDAPTestView": {
"type": "object",
"description": "LDAPTestView is how trying the directory went.",
"properties": {
"ok": {
"type": "boolean"
},
"checks": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CheckView"
}
}
}
},
"LDAPView": {
"type": "object",
"description": "LDAPView is auth.ldap as it is in force, and how its last sync went.",
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
}
},
"base_dn": {
"type": "string"
},
"bind_dn": {
"type": "string"
},
"label": {
"type": "string"
},
"off": {
"type": "string",
"description": "Off is why this control plane could not use the settings, when it could not; local accounts still sign in."
},
"last_sync": {
"$ref": "#/components/schemas/DirectorySyncView"
}
}
},
"Live": {
"type": "object",
"description": "Live is one of the cluster's adapters as its node last reported it.",
@@ -7492,6 +7741,27 @@
}
}
},
"OIDCView": {
"type": "object",
"description": "OIDCView is auth.oidc as it is in force.",
"properties": {
"issuer": {
"type": "string"
},
"client_id": {
"type": "string"
},
"label": {
"type": "string"
},
"create_accounts": {
"type": "boolean"
},
"no_passwords": {
"type": "boolean"
}
}
},
"OrgView": {
"type": "object",
"description": "OrgView is an organization with what is in it.",
@@ -8182,6 +8452,15 @@
}
}
},
"SecretRequest": {
"type": "object",
"description": "SecretRequest is a secret for the store to keep.",
"properties": {
"value": {
"type": "string"
}
}
},
"SettingsRequest": {
"type": "object",
"description": "SettingsRequest is a new version of the cluster's settings, made from the version Base, which must still be the newest.",