Receita — Convite por admin
Cenário: seu sistema é fechado. Só o admin concede acesso — usuários não podem se cadastrar sozinhos. O admin cria o usuário e define a senha inicial (ou envia link de reset).
O que acontece
Admin (Admin Console ou script)
│
├─ 1. Cria usuário via POST /admin/users
├─ 2. Cria membership via POST /admin/memberships
│ └─ atribui role(s) e opcionalmente profiles
└─ 3. Envia e-mail com senha temporária ou link de reset
│
Usuário faz login → Auth Platform verifica membership
→ emite token com roles e account_id
Passo 1 — Configurar o sistema (fechado)
curl -X POST http://localhost:4000/admin/systems \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "App Corporativo",
"redirectUris": ["https://app.empresa.com/callback"],
"allowedScopes": ["openid","email","profile","offline_access"],
"allowSelfRegister": false, # ← ninguém se cadastra sozinho
"requireAdminActivation": true, # ← memberships criadas como pending por padrão
"requireEmailOtp": false,
"requireMfa": false
}'
Passo 2 — Criar usuário
# Via Admin Console: Usuários → Novo usuário
# Via API:
USER=$(curl -s -X POST http://localhost:4000/admin/users \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "joao@empresa.com",
"password": "Senha@Temp123",
"emailVerified": true
}')
USER_ID=$(echo $USER | jq -r '.id')
echo "Usuário criado: $USER_ID"
Passo 3 — Conceder acesso
# Buscar role para atribuir
ROLES=$(curl -s http://localhost:4000/admin/systems/$SYSTEM_ID/roles \
-H "Authorization: Bearer $ADMIN_TOKEN")
MEMBER_ROLE_ID=$(echo $ROLES | jq -r '.[] | select(.name=="member") | .id')
# Criar membership — systemId cria a Account automaticamente
curl -X POST http://localhost:4000/admin/memberships \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"userId\": \"$USER_ID\",
\"systemId\": \"$SYSTEM_ID\",
\"roles\": [\"$MEMBER_ROLE_ID\"],
\"status\": \"active\"
}"
Dica: se o sistema tem
requireAdminActivation: true, a membership é criada comopending. Aprove comPATCH /admin/memberships/:id { "status": "active" }.
Passo 4 — Enviar credenciais ao usuário
Opção A — Senha temporária gerada
RESET=$(curl -s -X POST http://localhost:4000/admin/users/$USER_ID/reset-password \
-H "Authorization: Bearer $ADMIN_TOKEN")
TEMP_PASS=$(echo $RESET | jq -r '.temporaryPassword')
echo "Envie para o usuário:"
echo " E-mail: joao@empresa.com"
echo " Senha temporária: $TEMP_PASS"
# Envie por canal seguro (e-mail, chat, etc.)
Opção B — Link de reset de senha
# Dispara o e-mail de reset automaticamente via EmailService
curl -X POST http://localhost:4000/admin/users/$USER_ID/send-password-reset \
-H "Authorization: Bearer $ADMIN_TOKEN"
# → usuário recebe e-mail com link válido por 30 minutos
Passo 5 — Aprovar memberships em lote (script)
# examples/07-admin-api/aprovar-pendentes.sh
export ADMIN_TOKEN="..."
export AUTH_URL="http://localhost:4000"
export SYSTEM_ID="..."
# Lista memberships pendentes
PENDING=$(curl -s "$AUTH_URL/admin/memberships?status=pending&systemId=$SYSTEM_ID" \
-H "Authorization: Bearer $ADMIN_TOKEN")
# Aprova cada uma
echo $PENDING | jq -r '.data[].id' | while read MB_ID; do
curl -s -X PATCH "$AUTH_URL/admin/memberships/$MB_ID" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"active"}'
echo "Aprovado: $MB_ID"
done
Passo 6 — Revogar acesso
# Bloquear temporariamente (usuário não consegue logar)
curl -X PATCH http://localhost:4000/admin/memberships/$MEMBERSHIP_ID \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"blocked"}'
# Remover permanentemente
curl -X DELETE http://localhost:4000/admin/memberships/$MEMBERSHIP_ID \
-H "Authorization: Bearer $ADMIN_TOKEN"
# → emite webhook user.access_revoked
Automação via código (Node.js)
const AUTH_URL = 'http://localhost:4000';
async function inviteUser(adminToken: string, systemId: string, email: string, roleId: string) {
// 1. Criar usuário
const userRes = await fetch(`${AUTH_URL}/admin/users`, {
method: 'POST',
headers: { Authorization: `Bearer ${adminToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ email, emailVerified: true }),
});
const user = await userRes.json() as any;
// 2. Gerar senha temporária
const resetRes = await fetch(`${AUTH_URL}/admin/users/${user.id}/reset-password`, {
method: 'POST',
headers: { Authorization: `Bearer ${adminToken}` },
});
const { temporaryPassword } = await resetRes.json() as any;
// 3. Criar membership ativa
await fetch(`${AUTH_URL}/admin/memberships`, {
method: 'POST',
headers: { Authorization: `Bearer ${adminToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ userId: user.id, systemId, roles: [roleId] }),
});
return { userId: user.id, email, temporaryPassword };
}
Checklist
- Sistema com
allowSelfRegister: false - Role padrão criada para novos membros
- Processo definido para comunicar credenciais ao usuário
- Webhook configurado para notificações de acesso
- Script de aprovação em lote para onboarding em massa
Scripts prontos:
examples/07-admin-api/gerenciar-acesso.sheaprovar-pendentes.sh