Ir para o conteúdo
KeuralDocs
Desenvolvedores

Especificação de integração SSO e SCIM

Valores e comportamento para a integração OIDC, SAML 2.0 e SCIM 2.0.

Para a ordem de configuração na tela, consulte SSO e SCIM.

Em {API} da tabela, use o endereço da API do Keural do ambiente que você usa (por exemplo, https://api.keural.ai). Para o valor real, use o endereço exibido em Gerenciamento da organização → Configurações de SSO.

Resumo dos valores de registro

ItemValor
URI de redirecionamento OIDC{API}/api/sso/callback
Início de login OIDC·SAML{API}/api/sso/{orgId}/login
EntityID do SP SAML{API}/api/sso/saml/metadata
URL de ACS SAML{API}/api/sso/saml/callback
URL base do SCIM{API}/scim/v2

O login sempre começa no Keural (SP-initiated). Ao informar um e-mail de domínio cadastrado na tela de login, o usuário é direcionado ao endereço de início de login. Em caso de sucesso, o usuário vai para a tela inicial do Keural; em caso de falha, vai para /login?error=sso.

OIDC

ItemComportamento
FluxoAuthorization Code
Requisição authorizeresponse_type=code, client_id, redirect_uri, scope=openid email profile, state, nonce
state · nonceDe uso único e válidos por 10 minutos. Se a janela de login ficar aberta por mais de 10 minutos, o login é refeito desde o início.
Troca de tokenPOST no token endpoint, application/x-www-form-urlencoded. A autenticação do cliente é client_secret_post (client_id e client_secret no corpo).
Assinatura do ID tokenAceita somente RS256. A chave é localizada em jwks_uri pelo kid.
Validação do ID tokenAssinatura, exp, aud contendo o client_id, nonce igual, e iss igual à Issuer URL (a / final é ignorada).
E-mailClaim email do ID token. Se não existir, o userinfo endpoint é consultado com Authorization: Bearer <access_token> e o email é lido dele.
NomeClaim name do ID token
EndpointsLocalizados em /.well-known/openid-configuration da Issuer URL. Para um IdP que não possa ser encontrado, informe diretamente os endereços de authorization, token, JWKS e userinfo em Abrir configurações avançadas.
Tempo limite15 segundos para cada chamada ao IdP

A aplicação no IdP deve permitir client_secret_post. Se a configuração permitir apenas client_secret_basic ou private_key_jwt, a troca de token falhará.

SAML 2.0

ItemComportamento
RequisiçãoEnvia um AuthnRequest pelo binding HTTP-Redirect. A requisição não é assinada.
Conteúdo da requisiçãoDestination=URL de SSO do IdP, AssertionConsumerServiceURL=URL de ACS, ProtocolBinding=HTTP-POST, Issuer=EntityID do SP, NameIDPolicy Format=…:nameid-format:unspecified, AllowCreate=true
RespostaBinding HTTP-POST com SAMLResponse e RelayState. RelayState deve ser retornado exatamente como o Keural o enviou.
AssinaturaA Response ou a Assertion deve ter uma assinatura válida. A chave de verificação é somente o certificado cadastrado na tela.
AsserçãoA resposta deve conter exatamente uma asserção. Asserções criptografadas (EncryptedAssertion) não são aceitas.
StatusStatusCode igual a urn:oasis:names:tc:SAML:2.0:status:Success
IssuerSe você informou o EntityID do IdP, deve ser igual ao Issuer da asserção
CondiçõesNotBefore e NotOnOrAfter (tolerância de 300 segundos), Audience=EntityID do SP
SubjectConfirmationDataRecipient=URL de ACS, NotOnOrAfter (tolerância de 300 segundos), InResponseTo=ID da requisição enviada pelo Keural
E-mailAtributo cujo Name ou FriendlyName seja um dos seguintes (sem diferenciar maiúsculas): email, mail, emailAddress, E-Mail-Addresses, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress. Se não existir, usa-se o NameID que contenha @.
NomedisplayName, name, cn, http://schemas.microsoft.com/identity/claims/displayname
CertificadoUm certificado X.509. Pode estar em PEM ou em Base64 (DER). Para trocar, informe o novo certificado e salve.
MetadadosEm vez de enviar o XML de metadados do IdP, informe três valores: EntityID do IdP, URL de SSO do IdP e certificado.

Identificação do usuário

ItemComportamento
Critério para encaminhar ao SSOQuando o texto após @ do e-mail é exatamente igual a um item da lista de domínios de e-mail (sem diferenciar maiúsculas). Subdomínios são cadastrados separadamente.
Busca da contaProcura a conta do Keural pelo e-mail (em minúsculas) enviado pelo IdP.
Se a conta não existirSe Criar usuários automaticamente no primeiro login (JIT) estiver ativado, a conta é criada; se estiver desativado, o login é recusado.
Entrada na organizaçãoSe não for membro da organização, entra como membro. Se os assentos estiverem cheios ou se a conta pertencer a outra organização, não entra, e apenas o login é permitido.
Condição para salvar o domínio de e-mailDomínio verificado por TXT no DNS, exceto domínios de e-mail públicos

Verificação de domínio

ItemValor
Tipo de registroTXT
HostO domínio cadastrado exatamente como está (por exemplo, acme.com). Não use subdomínio com prefixo.
Valorkeural-verify=<UUID>, exatamente o valor exibido na tela
Momento da consultaConsultado uma vez, ao clicar em Confirmar verificação.

SCIM 2.0

ItemValor
URL base{API}/scim/v2
AutenticaçãoAuthorization: Bearer <token SCIM>. O token começa com scim_ e só é exibido uma vez, na emissão.
Content-TypeRequisição application/scim+json ou application/json; resposta application/scim+json
Códigos de statusRetorna o código de status HTTP real. O corpo de erro segue o formato SCIM Error (schemas, status, detail, scimType).

Endpoints

MétodoCaminhoComportamento
GET/UsersLista. filter=userName eq "…", startIndex (padrão 1), count (padrão 100, máximo 200)
GET/Users/{id}Consulta de um usuário
POST/UsersCriação (201). Se o mesmo e-mail já existir, retorna 409.
PATCH/Users/{id}Altera active, displayName, name.formatted e name.givenName
PUT/Users/{id}Aplica displayName, name e active. Se active for omitido, o usuário é considerado ativo.
DELETE/Users/{id}Suspende a conta (204). Não apaga os dados.
GET/Groups, /Groups/{id}Consulta dos dois grupos fixos. filter=displayName eq "…"
PATCH/Groups/{id}Adiciona, remove ou substitui membros
GET/ServiceProviderConfig, /ResourceTypes, /SchemasConsulta dos recursos suportados

Atributos do usuário

AtributoUso
userNameE-mail. Se ausente, usa-se emails[0].value.
displayName · name.formatted · name.givenName+name.familyNameNome de exibição
activefalse suspende (bloqueia o login); true restaura
idID do usuário no Keural. Vem na resposta.

O externalId não é armazenado. Para localizar um usuário no IdP, use o filtro userName.

Grupos

iddisplayNameAo adicionar um membroAo remover um membro
keural-adminsKeural AdminsAdministradorMembro
keural-membersKeural MembersMembroSem alteração

O papel do proprietário da organização não é alterado pelo SCIM. Criar e excluir grupos (POST·DELETE /Groups) retornam 501. O value de um membro do grupo é o ID do usuário no Keural (id de /Users).

Escopo de suporte

RecursoSuportado
PATCHSim
FiltrosuserName eq, displayName eq
Bulk · ordenação · ETag · alteração de senhaNão

Erros

StatusscimTypeCausa
400invalidValueuserName e emails ausentes
401—Token ausente ou incorreto, ou provisionamento SCIM desativado
404—O usuário ou grupo não pertence a esta organização
409uniquenessJá existe conta com o mesmo e-mail, ou o limite de assentos foi excedido
501—Criação ou exclusão de grupos

Nesta página