Pipeline de Busca e Mapeamento de Perfil

O django-sabia-auth utiliza o padrão de projeto Chain of Responsibility (Cadeia de Responsabilidade) para busca de dados (SABIA_USER_INFO_FETCHERS) e mapeamento de atributos (SABIA_USER_INFO_MAPPERS).


1. Cadeia de Busca (SABIA_USER_INFO_FETCHERS)

O elo padrão DefaultEndpointsUserInfoFetcher consome os endpoints listados em SABIA_USER_INFO_ENDPOINTS:

SABIA_USER_INFO_ENDPOINTS = [
    "/api/v1/userinfo",
]

Você pode estender a cadeia SABIA_USER_INFO_FETCHERS no settings.py para consultar APIs externas ou LDAP:

# meu_app/fetchers.py
from django_sabia_auth.fetchers import BaseUserInfoFetcher

class ExternalLdapFetcher(BaseUserInfoFetcher):
    def fetch(self, client, access_token, user_info=None):
        user_info = super().fetch(client, access_token, user_info)
        cpf = user_info.get("cpf")
        if cpf:
            user_info["ldap"] = meu_ldap.buscar_por_cpf(cpf)
        return user_info
# settings.py
SABIA_USER_INFO_FETCHERS = [
    "django_sabia_auth.fetchers.DefaultEndpointsUserInfoFetcher",
    "meu_app.fetchers.ExternalLdapFetcher",
]

2. Cadeia de Mapeamento (SABIA_USER_INFO_MAPPERS)

O elo padrão DefaultAttrMapUserMapper aplica o dicionário de regras SABIA_USER_ATTR_MAP:

SABIA_USER_INFO_MAPPERS = [
    "django_sabia_auth.mappers.DefaultAttrMapUserMapper",
]

SABIA_USER_ATTR_MAP = {
    "username": "cpf",
    "email": "email",
    "cpf": {
        "key": "cpf",
        "transform": "django_sabia_auth.transformers.format_cpf",
    },
    "foto": {
        "key": "foto_url",
        "transform": "django_sabia_auth.transformers.fetch_image_file",
    },
}