Estou trabalhando na implementação de OAuth 2.0 JWT access_token em meu servidor de autenticação. Porém, não tenho certeza de quais são as diferenças entre a aud
declaração JWT e o client_id
valor do cabeçalho HTTP. Eles são os mesmos? Se não, você pode explicar a diferença entre os dois?
Minha suspeita é que aud
deve se referir ao (s) servidor (es) de recursos, e o client_id
deve se referir a um dos aplicativos cliente reconhecidos pelo servidor de autenticação (ou seja, aplicativo da web ou aplicativo iOS).
No meu caso atual, meu servidor de recursos também é meu cliente de aplicativo da web.
aud REQUIRED for session_token. Contains the client_id of the client receiving the assertion.
A
aud
reivindicação JWT (público)De acordo com RFC 7519 :
A
aud
declaração Audience ( ) conforme definida pela especificação é genérica e específica do aplicativo. O uso pretendido é identificar os destinatários pretendidos do token. O que um destinatário significa é específico do aplicativo. Um valor de público é uma lista de strings ou pode ser uma única string se houver apenas umaaud
declaração. O criador do token não impõe queaud
seja validado corretamente, a responsabilidade é do destinatário para determinar se o token deve ser usado.Qualquer que seja o valor, quando um destinatário está validando o JWT e deseja validar que o token foi destinado a ser usado para seus fins, ele DEVE determinar qual valor em se
aud
identifica, e o token só deve validar se o ID declarado do destinatário for presente naaud
reivindicação. Não importa se este é um URL ou alguma outra string específica do aplicativo. Por exemplo, se meu sistema decidir se identificaraud
com a string:api3.app.com
então, ele só deve aceitar o JWT se aaud
declaração contiverapi3.app.com
em sua lista de valores de público.É claro que os destinatários podem escolher ignorar
aud
, portanto, isso só é útil se um destinatário quiser uma validação positiva de que o token foi criado especificamente para ele.Minha interpretação com base na especificação é que a
aud
afirmação é útil para criar JWTs construídos com um propósito que são válidos apenas para determinados fins. Para um sistema, isso pode significar que você deseja que um token seja válido para alguns recursos, mas não para outros. Você pode emitir tokens restritos a apenas um determinado "público", enquanto ainda usa as mesmas chaves e algoritmo de validação.Como, no caso típico, um JWT é gerado por um serviço confiável e usado por outros sistemas confiáveis (sistemas que não desejam usar tokens inválidos), esses sistemas simplesmente precisam coordenar os valores que usarão.
Claro,
aud
é totalmente opcional e pode ser ignorado se seu caso de uso não justificar. Se você não quiser restringir o uso de tokens por públicos específicos, ou nenhum de seus sistemas realmente validará oaud
token, então ele é inútil.Exemplo: tokens de acesso vs. atualização
Um exemplo inventado (mas simples) em que posso pensar é talvez queiramos usar JWTs para acessar e atualizar tokens sem ter que implementar chaves de criptografia e algoritmos separados, mas simplesmente querer garantir que os tokens de acesso não sejam validados como tokens de atualização ou vice-versa -versa.
Ao usar
aud
, podemos especificar uma reivindicação derefresh
tokens de atualização e uma reivindicação deaccess
tokens de acesso ao criar esses tokens. Quando uma solicitação é feita para obter um novo token de acesso de um token de atualização, precisamos validar se o token de atualização era um token de atualização genuíno. Aaud
validação conforme descrito acima nos dirá se o token era realmente um token de atualização válido, procurando especificamente por uma declaração derefresh
emaud
.ID do cliente OAuth x
aud
reivindicação JWTO ID do cliente OAuth não está relacionado e não tem correlação direta com as
aud
declarações do JWT . Da perspectiva do OAuth, os tokens são objetos opacos.O aplicativo que aceita esses tokens é responsável por analisar e validar o significado desses tokens. Não vejo muito valor em especificar o ID do cliente OAuth em uma
aud
declaração JWT .fonte
Se você veio aqui pesquisando OpenID Connect (OIDC): OAuth 2.0! = OIDC
Eu reconheço que isso é marcado para oauth 2.0 e NÃO OIDC, no entanto, há frequentemente uma conflação entre os 2 padrões, pois ambos os padrões podem usar JWTs e a
aud
declaração. E um (OIDC) é basicamente uma extensão do outro (OAUTH 2.0). (Eu mesmo encontrei esta questão procurando o OIDC.)Tokens de acesso OAuth 2.0 ##
Para tokens de acesso OAuth 2.0 , as respostas existentes cobrem muito bem. Além disso, aqui está uma seção relevante do OAuth 2.0 Framework (RFC 6749)
Tokens de ID OIDC ##
O OIDC tem tokens de ID além de tokens de acesso. A especificação OIDC é explícita no uso da
aud
declaração em tokens de ID. ( openid-connect-core-1.0 )além disso, OIDC especifica a
azp
declaração que é usada em conjunto comaud
quandoaud
tem mais de um valor.fonte
Embora seja antigo, acho que a pergunta é válida até hoje
Sim, aud deve se referir à parte consumidora do token. E client_id refere-se à parte que obtém o token.
No cenário do OP, o aplicativo da web e o servidor de recursos pertencem à mesma parte. Portanto, isso significa que o cliente e o público são iguais. Mas pode haver situações em que esse não seja o caso.
Pense em um SPA que consome um recurso protegido OAuth. Nesse cenário, o SPA é o cliente. O recurso protegido é o público do token de acesso.
Este segundo cenário é interessante. Existe um rascunho de trabalho denominado " Indicadores de recursos para OAuth 2.0 " que explica onde você pode definir o público-alvo em sua solicitação de autorização. Portanto, o token resultante será restrito ao público especificado. Além disso, o Azure OIDC usa uma abordagem semelhante em que permite o registro de recursos e permite que a solicitação de autenticação contenha o parâmetro de recurso para definir o público-alvo do token de acesso. Esses mecanismos permitem que as adpotações OAuth tenham uma separação entre o cliente e a parte consumidora do token (público).
fonte