Qualquer client OIDC
Integre o Authio a qualquer biblioteca OpenID Connect: discovery, fluxo de código de autorização com PKCE, SPAs e apps nativos, validação de tokens, renovação e logout.
Todo realm é um provedor OpenID Connect padrão, então qualquer biblioteca OIDC ou OAuth 2.0 certificada funciona sem SDK do Authio. Passe à biblioteca o emissor do realm, um client ID e, num client confidencial, o segredo; o resto ela lê do discovery. Esta página mostra as requisições como elas trafegam, para você saber o que a biblioteca faz e conseguir conferir com curl.
Discovery
O emissor é https://authio.api.hyperio.tech/realms/{realm}. O documento de discovery dele lista os endpoints, os escopos e grants que os clients do realm usam e os algoritmos suportados. Ele é servido no endereço do OpenID Connect e nas duas formas do RFC 8414, com CORS aberto a qualquer origem.
curl https://authio.api.hyperio.tech/realms/acme/.well-known/openid-configuration| Campo do discovery | Caminho sob o emissor |
|---|---|
authorization_endpoint | /protocol/openid-connect/auth |
token_endpoint | /protocol/openid-connect/token |
userinfo_endpoint | /protocol/openid-connect/userinfo |
jwks_uri | /protocol/openid-connect/certs |
introspection_endpoint | /protocol/openid-connect/introspect |
revocation_endpoint | /protocol/openid-connect/revoke |
end_session_endpoint | /protocol/openid-connect/logout |
device_authorization_endpoint | /protocol/openid-connect/device/auth |
Configure a biblioteca com o emissor, e não com endpoints avulsos. A lista completa, com todos os parâmetros, está em Endpoints OIDC.
Registre o client
| Configuração | O que escolher |
|---|---|
| Autenticação do client | Confidencial para tudo que tem um servidor capaz de guardar segredo. Público (método none) para SPAs, apps móveis e de desktop. |
| Método de autenticação no endpoint de token | client_secret_basic (o padrão) ou client_secret_post. O endpoint de token só aceita o método registrado. |
| Grants | authorization_code, mais refresh_token se você renova sessões. |
| PKCE | Exigido por padrão. Clients públicos precisam mantê-lo ligado e permitir S256. |
| Redirect URIs | Todo endereço para onde o login pode voltar, comparado por inteiro. Só http e https, sem curingas nem fragmentos. |
| Post-logout redirect URIs | Para onde o logout pode devolver as pessoas. Vazio aceita os redirect URIs. |
| Escopos | Todo escopo que a aplicação vai pedir, como openid profile email offline_access. |
Código de autorização com PKCE
Crie um verifier e o challenge dele
O verifier é uma string aleatória que a aplicação guarda; o challenge é o hash SHA-256 dela em base64url. Crie também um
statee umnoncealeatórios para este login.TerminalBashCODE_VERIFIER=$(openssl rand -hex 32) CODE_CHALLENGE=$(printf '%s' "$CODE_VERIFIER" | openssl dgst -sha256 -binary | openssl base64 -A | tr '+/' '-_' | tr -d '=')Mande o navegador para o endpoint de autorização
Pedido de autorizaçãoTexto simpleshttps://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/auth ?response_type=code &client_id=acme-web &redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback &scope=openid%20profile%20email%20offline_access &state=STATE &nonce=NONCE &code_challenge=CODE_CHALLENGE &code_challenge_method=S256Parâmetros opcionais:
prompt(none,login,select_account,consent),max_age,login_hint,ui_locales,id_token_hint,organizationeresource— o identificador de um servidor de recurso, para receber um access token para aquela API.display=popupcomresponse_mode=web_messagefaz o login num popup.Receba o código
Depois do login hospedado, o navegador volta com
code,stateeiss(RFC 9207). Confira sestateé o que você mandou e seissé o emissor do realm. O código é de uso único e expira em 30 segundos, então troque-o na hora. Uma recusa volta comerrorno lugar, também comstateeiss.RetornoTexto simpleshttps://app.example.com/callback?code=AUTHORIZATION_CODE&state=STATE&iss=https%3A%2F%2Fauthio.api.hyperio.tech%2Frealms%2FacmeTroque o código por tokens
Client confidencialBashcurl -X POST https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/token \ -u 'acme-web:YOUR_CLIENT_SECRET' \ -d grant_type=authorization_code \ -d code=AUTHORIZATION_CODE \ --data-urlencode redirect_uri=https://app.example.com/callback \ -d code_verifier=$CODE_VERIFIERRespostaJSON{ "access_token": "eyJhbGciOiJSUzI1NiIs...", "token_type": "Bearer", "expires_in": 1800, "refresh_token": "eyJhbGciOiJSUzI1NiIs...", "refresh_expires_in": 3600, "id_token": "eyJhbGciOiJSUzI1NiIs...", "scope": "openid profile email offline_access" }Valide o ID token como pede o OpenID Connect Core: assinatura,
iss,audigual ao seu client ID,expenonceigual ao que você mandou. Apresentar o mesmo código duas vezes revoga a sessão em que ele foi emitido.
SPAs, apps móveis e nativos
Aplicações que rodam no aparelho do usuário não conseguem guardar segredo, então usam um client público com PKCE e S256. Use uma biblioteca que faça o fluxo acima por você — uma certificada pelo OpenID para a sua plataforma.
- SPAs voltam para uma página
httpsda própria aplicação. O documento de discovery, o JWKS e o endpoint de token respondem a qualquer origem, então o código pode ser trocado no navegador. Para tirar os tokens do navegador de vez, coloque um Backend-for-Frontend na frente do SPA. - Apps de desktop e CLIs escutam na interface de loopback. Registre
http://127.0.0.1/callbacke ligue Loopback on any port: o Authio passa a aceitar qualquer porta em127.0.0.1,[::1]elocalhost(RFC 8252). - Apps móveis voltam por um link
httpsque o app reivindica (universal links ou app links). Redirect URIs precisam serhttpouhttps, então esquemas de URI próprios não são aceitos. - Aparelhos sem navegador, como TVs, usam o fluxo de dispositivo.
Valide access tokens
Uma API confere cada access token localmente, com as chaves do realm; um token válido não exige chamada ao Authio. Use a biblioteca JWT da sua plataforma com estas regras:
| Verificação | Regra |
|---|---|
| Assinatura | Uma chave do jwks_uri, encontrada pelo kid. Aceite só algoritmos assimétricos: RS, PS e ES 256/384/512. Nunca none. |
| Emissor | iss igual, exatamente, ao emissor do realm. |
| Audiência | aud é o identificador do servidor de recurso da sua API. Sem resource, os tokens levam a audiência do client, Authio por padrão. |
| Validade | exp no futuro, nbf no passado, com uma pequena tolerância de relógio. |
| Tipo do token | A claim typ vale Bearer. ID tokens e refresh tokens são assinados pelas mesmas chaves e precisam ser recusados. |
| Permissões | scope traz os escopos concedidos; os papéis estão nas claims *_resource_access quando o escopo roles foi concedido. |
Um JWT continua válido até expirar, mesmo depois que a sessão termina. Para perceber revogações e logouts antes, ou para aceitar tokens opacos ou criptografados, consulte o endpoint de introspecção (RFC 7662) como um client confidencial autorizado a introspectar os tokens da API. Ele sempre responde 200, com active: false e mais nada para qualquer token que não seja válido.
curl -X POST https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/introspect \
-u 'orders-api:YOUR_CLIENT_SECRET' \
-d token=ACCESS_TOKEN \
-d token_type_hint=access_tokenRefresh tokens
Um refresh token só é emitido quando offline_access é concedido. Apresente-o com a mesma autenticação de client da troca do código:
curl -X POST https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/token \
-u 'acme-web:YOUR_CLIENT_SECRET' \
-d grant_type=refresh_token \
-d refresh_token=REFRESH_TOKEN- Refresh tokens são rotacionados por padrão: guarde o novo
refresh_tokende cada resposta. - Dentro da janela de reuso (10 segundos por padrão), um pedido repetido recebe o mesmo refresh token novo. Um token gasto apresentado depois disso encerra a sessão inteira e é registrado como possível roubo.
- A renovação mantém
auth_time,amre oresourceoriginal. Ela só devolveid_tokense o client ligar ID Token on Refresh. - Uma recusa é
invalid_grant: faça o login da pessoa de novo.
UserInfo
O endpoint UserInfo devolve as claims atuais da pessoa, lidas de novo a cada chamada, até onde os escopos do token permitem. Ele exige um token com o escopo openid concedido. Responde JSON, a menos que o client tenha pedido um JWT assinado ou criptografado: veja UserInfo assinado e criptografado.
curl https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/userinfo \
-H 'Authorization: Bearer ACCESS_TOKEN'Logout
Para encerrar a sessão da pessoa, mande o navegador para o endpoint de logout com o ID token que você recebeu. Só um id_token_hint válido encerra a sessão — um expirado é aceito. Sem ele, o Authio mostra uma tela de confirmação no lugar.
https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/logout
?id_token_hint=ID_TOKEN
&post_logout_redirect_uri=https%3A%2F%2Fapp.example.com%2F
&state=STATEpost_logout_redirect_uri só é seguido se estiver registrado no client, comparado como um redirect URI; state volta inalterado. Para descartar tokens sem tirar a pessoa das outras aplicações do realm, revogue o refresh token (RFC 7009): isso encerra a sessão do client e mantém o login único.
curl -X POST https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/revoke \
-u 'acme-web:YOUR_CLIENT_SECRET' \
-d token=REFRESH_TOKEN \
-d token_type_hint=refresh_tokenAplicações que precisam saber quando uma sessão termina em outro lugar — por um administrador, uma suspensão, outra aba — podem registrar um endereço de logout por back-channel ou front-channel. Veja Sessões e SSO.