https://<name>.auth.didit.mepara uma aplicação em produção,https://<name>.sandbox.auth.didit.mepara uma aplicação de sandbox,- ou seu próprio domínio personalizado, depois de ativado.
DIDIT_AUTH_ISSUER como o seu emissor, sem barra no final, e DIDIT_APPLICATION_ID como o ID da sua aplicação: os tokens o carregam como aud. Sua chave publicável codifica o emissor: depois de pk_live_ ou pk_test_, vem o emissor em base64url sem preenchimento.
Quando o seu domínio personalizado fica ativo, ele substitui o host padrão como emissor. Os novos tokens o indicam em
iss, o documento de descoberta aponta jwks_uri para ele e sua chave publicável muda. Os tokens de acesso emitidos pelo host padrão passam então a falhar em GET /session/ até serem renovados. Atualize DIDIT_AUTH_ISSUER ao ativar o domínio ou aceite os dois emissores até que os tokens antigos expirem, em até 5 minutos.Descoberta e chaves
O emissor suporta:
- Tipo de resposta
codee modo de respostaquery. - Tipos de concessão
authorization_codeerefresh_token. - Apenas o método PKCE
S256. Os clientes são públicos: não há segredo de cliente, eclient_idé o ID da sua aplicação. - Algoritmo de assinatura
ES256(chaves P-256). - Escopos
openid,email,phone,profileeoffline_access.
prompt=none não é suportado. Use GET /session/ para ler e verificar uma sessão.
Cache e rotação
Os dois documentos respondem comCache-Control: public, max-age=300, então você e caches compartilhados podem mantê-los por 5 minutos. Eles permitem 1.200 requisições por minuto e 12.000 por hora por endereço IP, bem acima dos endpoints de login, porque muitas instâncias de backend costumam compartilhar um mesmo endereço.
- Cada chave tem um
kid; os novos IDs de chave começam comk_. Todo token indica sua chave no cabeçalhokid. - As chaves são rotacionadas a cada 30 dias. A Didit publica a próxima chave um dia antes de ela começar a assinar e mantém a chave anterior publicada por um dia depois que ela deixa de assinar. Assim, um JWKS em cache por 5 minutos continua verificando durante uma rotação.
- Armazene as chaves em cache por
kid. Quando um token indicar umkidque você não tem, busque o JWKS novamente, no máximo uma vez por minuto, e rejeite o token se a chave continuar ausente. - Quando a Didit revoga uma chave comprometida, ela remove a chave do JWKS imediatamente, e
GET /session/rejeita todos os tokens assinados por essa chave. Uma chave substituta começa a assinar na hora, sem o dia de publicação antecipada. Um JWKS em cache há até 5 minutos ainda aceita a chave revogada e ainda não conhece a substituta, então os novos tokens podem falhar na verificação offline até o cache ser atualizado.
Iniciar o login
Abra a página hospedada, que é oauthorization_endpoint:
Os guias de início rápido montam essa requisição para você.
Trocar o código
O callback recebecode e state. Verifique state e então troque o código em até 60 segundos. Cada código funciona uma única vez. O corpo pode ser JSON ou codificado como formulário.
expires_in indica os segundos que restam ao token de acesso. Quando você desativa as sessões múltiplas, essa troca encerra as outras sessões da pessoa.
Claims do token de acesso
O token de acesso é um JWT com cabeçalhoalg: ES256 e typ: at+jwt. Ele é válido por no máximo 5 minutos e nunca por mais tempo do que sua sessão.
O ID token tem cabeçalho
typ: JWT. Ele traz as mesmas claims, exceto client_id, e inclui também auth_time e email_verified, além de email, name e phone_number quando têm valor. Somente o ID token da troca do código traz nonce, quando o login incluía um: verifique-o ali, porque os ID tokens de uma renovação nunca o trazem. Um ID token nunca é aceito como token de acesso.
Verificar um token no seu servidor
Verifique todos estes pontos antes de confiar em uma claim:algéES256etypéat+jwt. Rejeite qualquer outro algoritmo, inclusivenone.- O
kidestá no JWKS da sua aplicação, e a assinatura é válida. issé igual ao emissor configurado, eaudé igual ao ID da sua aplicação.expeiatsão válidos, com tolerância de até 60 segundos de diferença de relógio, esub,sidejtiestão presentes.acténull. O token de acesso de um agente de IA é assinado com a mesma chave e traz os mesmostyp,isseaud; sóacto diferencia. Rejeite-o, a menos que o endpoint aceite agentes: nesse caso, permita apenas o queact.scopesconcede.GET /session/sempre rejeita o token de um agente.
GET /session/.
Verificar a sessão
sub, sid, application_id, vendor_data, amr, mfa_verified, email, email_verified, phone, verified_identity, verified, expires_at, post_logout_redirect_uri e organizations. Cada entrada de organização tem organization_id, organization__name, role e custom_role.
Esta verificação é mais rigorosa do que a verificação offline. Ela também falha quando a sessão foi revogada, ficou inativa ou ultrapassou seu tempo de vida, quando a pessoa foi bloqueada ou seu e-mail deixou de estar verificado, quando a sessão não atende mais à sua política de MFA (por exemplo, depois que a pessoa adicionou um app autenticador ou se tornou administradora de uma organização) ou quando o token foi substituído por uma renovação. Uma falha retorna 401 {"detail": "invalid_token"} com WWW-Authenticate: Bearer.
GET /session/ permite 30 requisições por minuto e 300 por hora por endereço IP, um limite compartilhado com DELETE /session/. Verifique os tokens offline em toda requisição e reserve esta chamada para os momentos que exigem isso. Cada chamada bem-sucedida conta como atividade, então ela reinicia o idle_timeout da sessão.
Um e-mail verificado não é uma verificação de identidade. Para isso, leia verified: aqui ele é null quando não há verificação, enquanto os tokens trazem {}.
Tokens de renovação
- O token de renovação é uma string aleatória, válida até o fim da sessão.
- A reutilização encerra a sessão. Quando um token de renovação já usado chega novamente, a Didit trata isso como sinal de roubo: ela revoga a sessão e retorna
400 {"error": "invalid_grant"}. Os tokens da sessão também deixam de funcionar, inclusive os da renovação anterior: o token de renovação deles falha, e as requisiçõesGET /session/com esses tokens de acesso falham imediatamente, embora ainda seja validado offline até expirar, em até 5 minutos. - Execute uma renovação por vez para cada sessão, considerando abas, dispositivos e instâncias de servidor, e substitua os três tokens juntos.
- Se uma renovação falhar com
400ou não houver resposta, inicie o login novamente. Não tente novamente às cegas: uma nova tentativa após uma renovação que de fato deu certo é uma reutilização. - Um
503 {"error": "temporarily_unavailable"}significa que a renovação não aconteceu e que seu token de renovação continua funcionando. Tente novamente com backoff. - A Didit responde com
429antes de executar a renovação, então tente novamente depois deRetry-After. O endpoint de token permite 30 requisições por minuto e 300 por hora por endereço IP. Além disso, todos osPOSTeDELETEda sua aplicação compartilham buckets de proteção contra bots: 60 requisições por minuto por endereço IP somando esses endpoints, 30 por minuto por dispositivo e 1.000 por minuto para a aplicação inteira, incluindo navegadores e etapas de login. - Com tokens de acesso de 5 minutos, 300 renovações por hora atendem cerca de 25 pessoas que permanecem ativas. Se o seu servidor faz renovações para muitas pessoas a partir de um único endereço, renove apenas quando uma requisição precisar de um novo token e, sempre que possível, faça a renovação no navegador ou no app.
Sair da sessão
DELETE /session/ com o access token atual da pessoa encerra a sessão e retorna 204. O refresh token dela deixa de funcionar, e os access tokens dela passam a falhar em GET /session/ imediatamente; tokens que você verifica offline continuam válidos até expirarem. Em seguida, redirecione a pessoa para o seu post_logout_redirect_uri, se você tiver definido um.
Sair da sessão exige um access token que GET /session/ aceitaria: um que não tenha expirado e não tenha sido substituído por um refresh. Um 401 significa que a sessão não foi encerrada. Faça o refresh e depois saia da sessão com o novo access token; se o refresh falhar com 400, a sessão não pode mais ser usada.
Uma sessão também é encerrada quando:
- ela ultrapassa
session_lifetime(padrão de 30 dias) ouidle_timeout(padrão de 1 dia), - a pessoa entra novamente enquanto múltiplas sessões estão desativadas,
- a pessoa redefine a senha enquanto
revoke_on_password_changeestá ativado, - sua equipe a revoga ou bloqueia a pessoa no console,
- um refresh token já usado é enviado novamente.
Tempos de vida
Armazene credenciais de acordo com a finalidade
- Mantenha as chaves de API de verificação e os tokens do console no seu servidor.
- Mantenha os access tokens do navegador em memória sempre que possível. Para aplicações renderizadas no servidor, use cookies HttpOnly seguros e proteja as requisições autenticadas por cookie contra CSRF.
- Armazene os refresh tokens de dispositivos móveis no armazenamento protegido da plataforma. Limpe o estado local depois de sair da sessão.
- Nunca coloque tokens em URLs ou logs.