- Em Login com a Cativa, a Cativa é o IdP: um app de terceiro autentica o usuário usando a conta da comunidade.
- Aqui, a empresa é o IdP: os membros entram na comunidade Cativa usando o sistema de login que a empresa já tem. A Cativa age como Relying Party e federa para o IdP do cliente.
cativa-sso traz um IdP OIDC mock pronto pra rodar na pasta cliente-idp (Node + Express): discovery, JWKS RS256, authorize/token/userinfo. Suba ele atrás de um túnel público e registre como provedor pra exercitar o fluxo ponta a ponta.Cenário
A comunidade Makers pertence à empresa Acme, que usa Google Workspace pra todo mundo. Você não quer que os colaboradores criem mais uma senha: eles clicam em “Entrar com a conta Acme”, passam pelo login do Google que já usam e caem dentro da comunidade já autenticados. No primeiro acesso, a Cativa cria a conta automaticamente a partir dos dados do Google (nome, email, avatar). A Cativa é o Relying Party: ela delega a autenticação ao IdP da empresa, valida oid_token que volta e vincula (ou provisiona) o usuário na comunidade.
Como funciona
A Cativa valida a assinatura doid_token (via JWKS do provedor), confere o audience (o seu client_id) e exige a claim email. No primeiro login, se auto-provisionamento estiver ligado, o usuário é criado na comunidade a partir dos dados do IdP.
Pré-requisitos
-
Um app OAuth/OIDC no seu IdP: crie um client no provedor da empresa e anote
client_id(YOUR_CLIENT_ID) eclient_secret(YOUR_SECRET). -
A URL de callback da Cativa, registrada no seu IdP como redirect URI autorizada. Você não precisa montá-la na mão: ao abrir o formulário de Identity Provider no admin da Cativa (próxima seção), ele mostra a URL de callback exata, com o seu slug já preenchido, e um botão Copiar. Cole esse valor no client do seu IdP. O formato é:
{customerName}é o slug da sua comunidade, o subdomínio público da Cativa (https://{customerName}.cativa.digital). É fixo por tenant, e o admin que está configurando já o conhece (é a comunidade dele). Na dúvida, copie a URL que o formulário mostra em vez de digitar o slug você mesmo. - Acesso de admin à comunidade Cativa para cadastrar o provedor.
Etapa 1: Cadastrar o Identity Provider
No admin da comunidade, em Integrações → SSO → Provedores → Novo provedor, escolha o preset do seu IdP (Google, Microsoft, Okta, Auth0, Keycloak) ou Custom (OIDC) e preencha:Discovery
.well-known/openid-configuration do seu IdP) e clique em Buscar configuração, a Cativa preenche authorize/token/userinfo/jwks sozinha. (Em provedores sem discovery, informe os endpoints manualmente.)Credenciais
Client ID e Client Secret do client que você criou no IdP, e os Scopes (no mínimo openid email profile).Provisionamento
Slug
empresa), ele entra na URL de início do login federado.Etapa 2: Disparar o login em runtime
Depois de cadastrado, o login federado é um fluxo de redirects que a Cativa orquestra. Você só precisa apontar um botão pra URL de início; o resto acontece server-side.Aponte o botão de login pra URL de início
302 pro /authorize do IdP da empresa.O usuário autentica no IdP da empresa
O IdP volta pro callback da Cativa
state contra o cookie, troca o code por um id_token no /token do IdP e valida a assinatura via jwks do provedor.A Cativa vincula ou provisiona e redireciona já logado
id_token validado, a Cativa extrai o email, procura um usuário existente na comunidade e:- Se existe: vincula a identidade externa e abre a sessão.
- Se não existe e auto-provisionar está ligado: cria o usuário a partir das claims (
email,given_name,family_name,picture) com a Role padrão.
302 pro frontend da comunidade com o usuário já autenticado. Nenhum código do seu lado roda nesta etapa.O que o IdP precisa devolver
- Um
id_tokenassinado, validável pelojwksdo provedor (a Cativa busca a chave pública do discovery/JWKS). - A claim
emailé obrigatória, é a chave de identidade. Sem ela o login é recusado. given_name/family_name/picturesão usados (quando presentes) ao auto-provisionar o usuário.
id_token que a Cativa espera receber do seu IdP tem esta forma (ilustrativa):
Testar com o IdP mock
Antes de plugar o Google Workspace ou o Okta de produção, dá pra exercitar o fluxo inteiro com o IdP mock do repocativa-sso:
Suba o IdP mock atrás de um túnel
cliente-idp (Node + Express), rode o servidor e exponha-o com um túnel público (ex.: ngrok http 3000). Anote a URL pública (ex.: https://abc123.ngrok.app), o discovery fica em https://abc123.ngrok.app/.well-known/openid-configuration.Registre o provedor na Cativa
client_id/client_secret que o mock aceita (estão no README da pasta). Ligue Auto-provisionar com Role padrão Usuário e defina o slug mock.Rode o fluxo ponta a ponta
https://apis.cativalab.digital/tenant/api/v2/sso/external/{customerName}/mock/authorize. O mock apresenta um formulário de login fake, emite um id_token RS256 com a claim email, e a Cativa te devolve logado na comunidade. Um usuário novo deve aparecer no admin com o email que você digitou.Erros comuns
Estado inválido ou expirado no callback
Estado inválido ou expirado no callback
sso_state) não voltou. Garanta que o IdP redirecionou para a mesma URL de callback registrada (.../tenant/api/v2/sso/external/{customerName}/callback, com o prefixo completo) e que o fluxo foi concluído dentro de 10 minutos.O provedor não retornou um email válido
O provedor não retornou um email válido
id_token veio sem a claim email. Ajuste os scopes/claims no client do seu IdP para incluir email (e email_verified quando aplicável).Provedor de identidade não identificado
Provedor de identidade não identificado
/sso/external/{customerName}/{slug}/authorize (com o slug correto).Token de identidade inválido
Token de identidade inválido
id_token não validou, ou o audience não bate. Confira que o Client ID cadastrado é o mesmo aud que o IdP emite, e que a Metadata URL aponta para o JWKS certo.Usuário entra mas não vê os grupos/cursos esperados
Usuário entra mas não vê os grupos/cursos esperados
Próximos passos
Login com a Cativa
Badges como permissão
IdP de exemplo (GitHub)
cliente-idp é um IdP OIDC mock pronto pra rodar, para testar este fluxo.