O que é público (audience)?
No contexto de Autenticação (Authentication, AuthN) e Autorização (Authorization) , público (audience) é um componente chave que define os destinatários pretendidos de um token de autorização. Referido como a claim aud em JSON Web Token (JWT) , essa claim garante que o token seja aceito apenas pelo serviço ou aplicativo designado. Tipicamente, a claim de público contém ou o client_id do aplicativo para o qual o token é destinado ou uma URL representando a API ou recurso que o token está autorizado a acessar. Ao especificar o público, serve como um controle de segurança para prevenir o uso indevido por serviços ou usuários não autorizados.
Como funciona o público (audience)?
Quando um cliente solicita um Token de acesso (Access token) de um authorization server, a claim de público é incluída na resposta do token. Este valor de público é então validado pelo resource server quando o token é apresentado. O resource server verifica se a claim de público no token corresponde ao seu próprio identificador ou ao identificador do serviço que está protegendo. Se não corresponder, o token será rejeitado, aumentando a segurança em sistemas distribuídos, particularmente em cenários envolvendo múltiplos microsserviços ou APIs. Ao controlar a claim de público, os desenvolvedores podem garantir que os tokens sejam usados no contexto correto, adicionando uma camada adicional de proteção aos fluxos de authentication e authorization de suas aplicações.
- Solicitante: O aplicativo cliente especifica o valor do público ao solicitar um token.
- Emissor: O authorization server inclui a claim de público na resposta do token.
- Verificador: O destinatário do token verifica a claim de público em relação ao seu próprio identificador. Se a claim de público corresponder ao identificador do destinatário, o token é considerado válido. Caso contrário, é rejeitado.
Exemplo de público (audience) em JWT
Claim de público em um ID token de OpenID Connect (OIDC)
{
"header": {
"alg": "RS256",
"typ": "JWT",
"kid": "abc123"
},
"payload": {
"iss": "https://auth.logto.io",
"sub": "test_user",
"aud": "client_id_foo",
"exp": 1516239022,
"iat": 1516239022,
"nonce": "n-0S6_WzA2Mj",
"primary_email": "[email protected]",
"email_verified": true,
"username": "foo"
},
"signature": "..."
}
Um Token de ID (ID token) em OpenID Connect (OIDC) é um token de segurança que contém informações sobre o usuário autenticado, entregue ao aplicativo cliente após uma authentication bem-sucedida. Ao contrário dos access tokens, que são usados para conceder permissão para acessar recursos, os ID tokens são especificamente projetados para transmitir informações de identidade do usuário para a parte confiável (cliente). Esses tokens são tipicamente codificados como JWTs e incluem claims como o identificador do usuário (claim sub), o emissor (claim iss) e o público (claim aud), entre outros.
Neste caso, a claim aud
especifica o público pretendido para o ID token, que é o aplicativo cliente. O valor da claim aud
geralmente corresponde ao client_id
do aplicativo que solicitou o token. Quando o aplicativo cliente recebe o ID token, ele pode verificar a claim de público para garantir que o token foi emitido para seu consumo. Esta etapa de validação ajuda a prevenir o uso indevido do token e o acesso não autorizado a informações do usuário, aumentando a segurança do processo de authentication.
Claim de público em um access token
{
"header": {
"alg": "RS256",
"typ": "JWT",
"kid": "abc123"
},
"payload": {
"iss": "https://auth.logto.io",
"sub": "test_user",
"aud": "https://example.logto.app/api/users",
"exp": 1516239022,
"iat": 1516239022,
"scope": "read write",
"client_id": "client_id_foo"
},
"signature": "..."
}
Ao contrário do ID token, Token de acesso (Access token) são usados para autorizar o acesso a recursos protegidos, como APIs ou serviços. A claim aud
em um access token especifica o destinatário pretendido do token, que é tipicamente a API ou serviço que o token está autorizado a acessar. Tipicamente, o resource server que hospeda a API tem um domínio diferente do aplicativo cliente que solicitou o token. Neste caso, em vez de um client_id
, a claim aud
contém a URL do endpoint da API para o qual o token é destinado. Esta URL é frequentemente conhecida como o resource indicator ou API identifier que identifica unicamente o recurso alvo.
Quando o resource server recebe um access token, ele valida a claim aud
para garantir que o token é destinado ao seu consumo. Ao verificar o público, o resource server pode prevenir o acesso não autorizado aos seus recursos e aplicar políticas de access control baseadas no público pretendido do token. Este mecanismo ajuda a proteger dados sensíveis e garante que os access tokens sejam usados no contexto apropriado, aumentando a segurança do sistema como um todo.
FAQs
Por que a claim de público é importante na validação de tokens?
A claim de público é crucial na validação de tokens porque garante que o token seja aceito apenas pelo destinatário pretendido. Ao verificar a claim de público, o destinatário pode prevenir o uso indevido do token e o acesso não autorizado a recursos. Este controle de segurança é particularmente importante em sistemas distribuídos onde múltiplos serviços interagem entre si, pois ajuda a aplicar políticas de access control e proteger dados sensíveis.
Um token pode ter múltiplos públicos?
Por razões de segurança, é recomendado que um token tenha um único público para prevenir ambiguidades e garantir que o token seja usado no contexto correto. No entanto, alguns cenários podem exigir tokens com múltiplos públicos, como quando um token é destinado a múltiplos serviços ou APIs dentro do mesmo domínio. Nesses casos, os desenvolvedores devem considerar cuidadosamente as implicações de usar tokens com múltiplos públicos e implementar medidas de segurança apropriadas para mitigar riscos potenciais.
O que devo usar como meu identificador de API na claim de público?
Ao especificar a claim de público em um access token que representa uma API ou serviço, é recomendado usar um URI absoluto que identifique unicamente o recurso. Este URI pode ser a URL base do endpoint da API ou um caminho de recurso específico que o token está autorizado a acessar. Ao usar um URI como identificador de API, você pode garantir que a claim de público seja inequívoca e represente com precisão o destinatário pretendido do token.