Scopes disponíveis

O Sabiá expõe os dados do usuário por meio de scopes OAuth2. Ao solicitar um scope durante a autenticação, você recebe os campos correspondentes na resposta de POST /api/perfil/dados/, que é chamado automaticamente pelo SabiaOAuth2Client.get_user_info().

Configure os scopes desejados via SABIA_SCOPES nas suas settings:

SABIA_SCOPES = ["cpf", "email", "dados_publicos", "receita_federal", "cnes",
                "experiencia_profissional", "formacao_academica", "cursos_cdp"]

Autorização por aplicação

Cada scope precisa estar habilitado para a sua aplicação no painel do Sabiá. Solicitar um scope não autorizado retorna um erro ou simplesmente omite o campo da resposta.


Scopes obrigatórios

Estes scopes estão sempre presentes independentemente do que for solicitado.

dados_publicos

Perfil público — sempre retornado, mesmo que não listado em SABIA_SCOPES.

Campo Tipo Exemplo
name string "Maria Silva"
avatar string (URL) "https://login.sabia.ufrn.br/media/avatars/1.jpg"

cpf

Campo Tipo Exemplo
cpf string "12345678900"

email

Campo Tipo Exemplo
email string "maria.silva@email.com"

Exemplo de resposta com os scopes obrigatórios:

{
  "name": "Maria Silva",
  "avatar": "https://login.sabia.ufrn.br/media/avatars/1.jpg",
  "cpf": "12345678900",
  "email": "maria.silva@email.com"
}

Scopes opcionais

receita_federal

Dados complementares vindos da Receita Federal. Requer que o usuário tenha validado seu cadastro via CPF. Estes dados são cacheados por até 5 anos no servidor do Sabiá.

Se o usuário não tiver validado, retorna:

{ "receita_federal": { "erro": "Dados deste usuário não foram validados pela Receita Federal." } }

Campos disponíveis (nomes originais do XML do webservice da Receita Federal):

Campo Tipo Exemplo
nome string "MARIA SILVA"
dtNascimento string (AAAA-MM-DD) "1990-05-20"
sexo string "F"
mae string "ANA SILVA"
noMunicipio string "NATAL"
uf string "RN"

Exemplo de resposta:

{
  "receita_federal": {
    "nome": "MARIA SILVA",
    "dtNascimento": "1990-05-20",
    "sexo": "F",
    "mae": "ANA SILVA",
    "noMunicipio": "NATAL",
    "uf": "RN"
  }
}

cnes

Perfil profissional completo a partir do CNES (Cadastro Nacional de Estabelecimentos de Saúde). Cacheado por 7 dias no servidor do Sabiá.

Retorna um objeto com a chave vinculos, que é uma lista de vínculos profissionais:

Campo Tipo Exemplo
cnes string "2408102"
noFant string "HOSPITAL DAS CLÍNICAS"
coMun string "240810"
noCBO string "Médico Clínico"

Exemplo de resposta:

{
  "cnes": {
    "vinculos": [
      {
        "cnes": "2408102",
        "noFant": "HOSPITAL DAS CLÍNICAS",
        "coMun": "240810",
        "noCBO": "Médico Clínico"
      }
    ]
  }
}

experiencia_profissional

Experiências profissionais cadastradas pelo próprio usuário no Sabiá (complementadas automaticamente pelo CNES na primeira autenticação com o scope cnes). Dados sempre frescos do banco de dados.

Retorna uma lista de objetos:

Campo Tipo Exemplo
estabelecimento string "Hospital das Clínicas"
profissao string "Médico Clínico"
data_inicio datetime / null "2020-01-15T00:00:00"
data_fim datetime / null null
municipio string "Natal - RN"
descricao string "Plantões na UTI"

Exemplo de resposta:

{
  "experiencia_profissional": [
    {
      "estabelecimento": "Hospital das Clínicas",
      "profissao": "Médico Clínico",
      "data_inicio": "2020-01-15T00:00:00",
      "data_fim": null,
      "municipio": "Natal - RN",
      "descricao": ""
    }
  ]
}

Se o usuário não tiver experiências cadastradas:

{ "experiencia_profissional": { "erro": "Nenhuma experiência profissional cadastrada." } }


formacao_academica

Formação acadêmica cadastrada pelo usuário. Dados sempre frescos do banco de dados.

Retorna uma lista de objetos:

Campo Tipo Exemplo
instituicao string "UFRN"
curso string "Medicina"
data_inicio date "2010-03-01"
data_fim date / null "2016-12-01"
municipio string "Natal - RN"
descricao string ""
grau_formacao string "Graduação"

Valores possíveis para grau_formacao:

Código Descrição
GRA Graduação
ESP Especialização
MES Mestrado
MEP Mestrado Profissional
DTR Doutorado
PDR Pós-Doutorado
ENF Ensino Fundamental
ENM Ensino Médio
EPT Ed. Prof. Técnica
ERM Residência Médica

Exemplo de resposta:

{
  "formacao_academica": [
    {
      "instituicao": "UFRN",
      "curso": "Medicina",
      "data_inicio": "2010-03-01",
      "data_fim": "2016-12-01",
      "municipio": "Natal - RN",
      "descricao": "",
      "grau_formacao": "Graduação"
    }
  ]
}

cursos_cdp

Cursos realizados na Comunidade de Práticas (CDP). Cacheado por 24 horas no servidor do Sabiá.

Retorna um objeto com total e data:

Campo Tipo Exemplo
total int 3
data array lista de cursos

Cada curso em data:

Campo Tipo Exemplo
title string "Humanização em Saúde"
descricao string "Curso sobre humanização..."
vinculo string "CDP"
link string "https://cdp.saude.gov.br/cursos/123"
status string "Concluído"
nid int 123
created string "2023-06-01"
type string "course"

Exemplo de resposta:

{
  "cursos_cdp": {
    "total": 1,
    "data": [
      {
        "title": "Humanização em Saúde",
        "descricao": "Curso sobre humanização no atendimento.",
        "vinculo": "CDP",
        "link": "https://cdp.saude.gov.br/cursos/123",
        "status": "Concluído",
        "nid": 123,
        "created": "2023-06-01",
        "type": "course"
      }
    ]
  }
}

Resumo dos scopes

Scope Obrigatório Cache Fonte
dados_publicos Sim Nenhum Banco do Sabiá
cpf Sim Nenhum Banco do Sabiá
email Sim Nenhum Banco do Sabiá
receita_federal Não 5 anos Webservice RF
cnes Não 7 dias API do CNES
experiencia_profissional Não Nenhum Banco do Sabiá
formacao_academica Não Nenhum Banco do Sabiá
cursos_cdp Não 24 horas API da CDP

Mapeando campos para o seu model (SABIA_USER_ATTR_MAP)

Após a autenticação, os dados retornados pelo Sabiá precisam ser salvos no seu AUTH_USER_MODEL. Use SABIA_USER_ATTR_MAP nas settings para declarar esse mapeamento.

A convenção é {campo_do_model: campo_do_sabiá}:

SABIA_USER_ATTR_MAP = {
    "username": "cpf",
    "email":    "email",
}

Dividindo o nome em dois campos

Use uma tupla como chave para dividir o valor do Sabiá no primeiro espaço:

SABIA_USER_ATTR_MAP = {
    "username": "cpf",
    "email":    "email",
    ("first_name", "last_name"): "name",   # "Maria Silva Santos" → "Maria" + "Silva Santos"
}

Acessando campos de scopes opcionais (objeto)

O scope receita_federal retorna um objeto (dict), portanto seus campos individuais podem ser extraídos com notação de ponto:

SABIA_SCOPES = ["cpf", "email", "receita_federal"]

SABIA_USER_ATTR_MAP = {
    "username":         "cpf",
    "email":            "email",
    ("first_name", "last_name"): "name",
    "nome_mae":         "receita_federal.mae",
    "sexo":             "receita_federal.sexo",
    "data_nascimento":  "receita_federal.dtNascimento",
}

Se o scope não estiver disponível (usuário não validado, erro de API, etc.), os campos correspondentes são simplesmente ignorados — o usuário ainda é criado com os demais atributos.

Scopes que retornam listas

Os scopes cnes, experiencia_profissional, formacao_academica e cursos_cdp retornam listas de objetos, não um objeto único. A notação de ponto não se aplica a eles; para persistir esses dados, use o campo virtual fulljson descrito abaixo.

Salvando o JSON completo (fulljson)

Use a chave especial "fulljson" para mapear o JSON inteiro retornado pelo Sabiá para um campo do seu model (por exemplo, um JSONField):

SABIA_USER_ATTR_MAP = {
    "username":     "cpf",
    "email":        "email",
    "perfil_json":  "fulljson",   # salva todo o payload em um JSONField
}

Isso é especialmente útil quando você usa scopes como cnes, experiencia_profissional ou cursos_cdp e quer persistir os dados brutos sem precisar ter um campo para cada atributo.

Exemplo: model com campo cpf nativo e nome único

# settings.py
SABIA_USER_LOOKUP_FIELD = "cpf"   # campo usado no get_or_create

SABIA_USER_ATTR_MAP = {
    "cpf":   "cpf",
    "email": "email",
    "nome":  "name",   # nome completo em um único campo
}

Consulte Configuration para a referência completa de todas as opções.