Desenvolvedores¶
O Sabiá é o provedor de identidade dos sistemas do SUS parceiros do LAIS: com ele, o usuário entra no seu sistema com a conta do Sabiá (CPF ou e-mail e senha, ou gov.br), sem criar outro cadastro. A integração usa OAuth 2.0.
Cadastrar a aplicação¶
No portal desenvolvedores (entre com a sua conta do Sabiá) crie a aplicação e informe nome, descrição, logo,
e-mail de contato, domínios e as URIs de redirecionamento (http ou https). Escolha também:
Tipo de cliente: confidencial (o
client_secretfica num servidor) ou público (aplicativo ou página que não guarda segredo; envia só oclient_ide deve usar PKCE).Tipo de concessão: cada aplicação usa um tipo (código de autorização, implícita, senha ou credenciais do cliente), mais a atualização de token. Pedir outro tipo devolve
unauthorized_client.Escopos opcionais que a aplicação usa (ver abaixo). Os obrigatórios ficam sempre ligados.
O client_secret aparece uma única vez, ao criar a aplicação ou gerar um novo: copie e guarde num cofre. Se
perder, gere outro; o anterior deixa de valer.
Membros: o dono adiciona outras pessoas pelo CPF ou e-mail, como admin (edita a aplicação, escopos, segredo e membros) ou developer (só consulta). Só o dono remove admins.
Endereços¶
Todos no domínio do login do Sabiá (em produção, https://login.sabia.ufrn.br):
Endereço |
Uso |
|---|---|
|
Tela de entrada e de consentimento; devolve o código (ou o token, na implícita) |
|
Troca o código, a senha, as credenciais do cliente ou o token de atualização por tokens |
|
Revoga um token de acesso ou de atualização (RFC 7009) |
|
Dados do usuário, conforme os escopos |
|
Encerra a sessão do usuário no Sabiá |
Fluxo recomendado: código de autorização com PKCE¶
Redirecione o usuário para a autorização, com um
statealeatório e o desafio PKCE (S256):https://login.sabia.ufrn.br/oauth/authorize/?response_type=code&client_id=CLIENT_ID &redirect_uri=https%3A%2F%2Fseusistema.exemplo%2Fretorno%2F&scope=cpf+email+dados_publicos &state=STATE&code_challenge=DESAFIO&code_challenge_method=S256O usuário entra e, na primeira vez, autoriza a aplicação. O Sabiá volta para a
redirect_uricom?code=...&state=...(ou?error=access_denied&state=...se ele cancelar). Confira ostate.Troque o código (vale 10 minutos e uma só vez) pelos tokens:
curl -X POST https://login.sabia.ufrn.br/oauth/token/ \ -d grant_type=authorization_code -d code=CODIGO \ -d redirect_uri=https://seusistema.exemplo/retorno/ \ -d client_id=CLIENT_ID -d client_secret=CLIENT_SECRET -d code_verifier=VERIFICADOR
{"access_token": "...", "expires_in": 86400, "token_type": "Bearer", "scope": "cpf email dados_publicos", "refresh_token": "..."}
Peça os dados do usuário (
POST, com os escopos desejados no corpo):curl -X POST https://login.sabia.ufrn.br/api/perfil/dados/ \ -H "Authorization: Bearer ACCESS_TOKEN" -d "scope=cpf email dados_publicos"
As credenciais do cliente podem ir no corpo (application/x-www-form-urlencoded ou multipart/form-data) ou
em HTTP Basic. A redirect_uri precisa ser exatamente uma das cadastradas; sem ela, vale a primeira.
Escopos e dados¶
/api/perfil/dados/ sempre devolve uuid (identificador público e estável do usuário), name e avatar
(URL da foto), mais os campos dos escopos pedidos que o token tem e que estão ligados para a aplicação. Escopos não
ligados são ignorados sem erro.
Escopo |
Tipo |
Conteúdo |
|---|---|---|
|
obrigatório |
CPF (11 dígitos); |
|
obrigatório |
|
|
obrigatório |
Nome e foto |
|
opcional |
Vínculos do CNES (cache da consulta) |
|
opcional |
Dados da Receita Federal, ou |
|
opcional |
Lista de experiências (estabelecimento, profissão, datas, município, descrição), ou |
|
opcional |
Lista de formações (instituição, curso, grau, datas, município, descrição), ou |
Use o uuid como chave do usuário no seu sistema: o CPF pode faltar (estrangeiros) e o e-mail pode mudar.
Validade dos tokens¶
Código de autorização: 10 minutos, uso único.
Token de acesso: 24 horas.
Token de atualização: 30 dias, com rotação: cada uso devolve um novo par e invalida o anterior. Guarde sempre o último. A concessão implícita não emite token de atualização.
Revogar o token de atualização também revoga o de acesso. A revogação responde
200mesmo para token desconhecido.
Erros¶
/oauth/token/ responde no formato da RFC 6749 ({"error": ..., "error_description": ...}): invalid_client
(401), invalid_request, invalid_grant (código ou token expirado, code_verifier inválido, usuário
inativo), invalid_scope, unauthorized_client e unsupported_grant_type. Com o serviço indisponível, 503
e temporarily_unavailable.
Em /api/perfil/dados/: 401 sem token válido (inclusive token de credenciais do cliente, que não tem
usuário), 405 com GET, e 506 com {"erro": {"codigo": 9}} (nenhum escopo válido) ou codigo 10
(aplicação inativa).
Ao receber invalid_grant na atualização, mande o usuário entrar de novo.
Boas práticas¶
Prefira o código de autorização com PKCE
S256estate; evite as concessões implícita e de senha.Mantenha o
client_secretsó no servidor; aplicativos e páginas devem ser clientes públicos.Peça só os escopos de que precisa: o usuário vê a lista na tela de consentimento.
Não guarde senhas do Sabiá nem tente reproduzir a tela de login dentro do seu sistema.
API de parceiros (token de API)¶
Para criar e consultar contas de usuários direto do seu servidor, sem o usuário na tela, há a API de parceiros em
https://api.sabia.ufrn.br/usuarios/. Ela só atende aplicações com acesso à API liberado pela equipe do Sabiá
(peça ao suporte) e usa o token de API da aplicação, gerado na tela de detalhes da aplicação no portal
desenvolvedores. O token aparece uma única vez; gerar outro invalida o anterior.
Envie o token no cabeçalho Authorization: Token <token de API>. Sem token ou com token inválido, a resposta é
401; sem acesso à API, 403.
GET /usuarios/{cpf_ou_email}/: dados da conta (perfil, formações, Receita Federal e CNES);404se não existir.GET /usuarios/?cpfs=<cpf>,<cpf>&page=1: várias contas por CPF, 100 por página.POST /usuarios/em formulário comcpf,email,nome,genero(MouF) edata_de_nascimento(AAAA-MM-DD): cria uma conta (201).POST /usuarios/em JSON comalunos: cria várias contas de uma vez, cada uma comformacoes(instituicaoecursopelo código do e-MEC,municipiopelo código do IBGE,data_inicio,data_fimopcional,descricaoegrau_formacao). Se algum item tiver erro, nenhuma conta é criada e a resposta400traz todos os erros.DELETE /usuarios/{cpf_ou_email}/: remove a conta que nunca entrou no Sabiá (401se já entrou).
A conta criada recebe por e-mail um link para criar a senha, válido por 30 dias; depois disso, a pessoa usa “Esqueceu a senha?” na tela de entrada.
Atualização para o Sabiá 2: o que muda para parceiros¶
Continuam iguais: os endereços acima, o
client_id, oclient_secrete as URIs de redirecionamento.Tokens e sessões não são migrados: depois da atualização, o token de atualização antigo recebe
invalid_grante todos os usuários entram de novo. Trate esse erro pedindo nova autorização./api/perfil/dados/exigePOSTcom oscopeno corpo e não devolve maissenha_criptografada; passa a devolver ouuiddo usuário.Os tokens de API do Sabiá 1 cuja chave era o
client_idnão são migrados. Gere um token de API no portal desenvolvedores e troque a chave no cabeçalhoAuthorization: Token; endereços e formatos da API de parceiros continuam iguais. As aplicações que tinham acesso à API no Sabiá 1 continuam com ele.Saem da API de parceiros:
/usuarios/{cpf}/logout/,/usuarios/stats/,/stats/,/cns/e/cns-retsus/, que passam a responder410.
Ajuda¶
Dúvidas sobre integração: sabia@atendimento.lais.ufrn.br, informando o nome da aplicação e o client_id (nunca
envie o client_secret).