Melhor tipo de cabeçalho de Autorização HTTP para JWT

228

Gostaria de saber qual é o melhor Authorizationtipo de cabeçalho HTTP apropriado para tokens JWT .

Um dos tipos provavelmente mais populares é Basic. Por exemplo:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Ele lida com dois parâmetros, como um login e uma senha. Portanto, não é relevante para os tokens JWT.

Além disso, ouvi falar do tipo Bearer , por exemplo:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

No entanto, eu não sei o seu significado. Está relacionado aos ursos?

Existe uma maneira específica de usar tokens JWT no Authorizationcabeçalho HTTP ? Devemos usar Bearerou simplificar e apenas usar:

Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Obrigado.

Editar:

Ou talvez, apenas um JWTcabeçalho HTTP:

JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Zag zag ..
fonte

Respostas:

295

O melhor cabeçalho HTTP para o seu cliente enviar um token de acesso (JWT ou qualquer outro token) é o Authorizationcabeçalho com o Beareresquema de autenticação.

Este esquema é descrito pelo RFC6750 .

Exemplo:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIXVCJ9TJV...r7E20RMHrHDcEfxjoYZgeFONFh7HgQ

Se você precisar de uma proteção de segurança mais forte, considere também o seguinte rascunho da IETF: https://tools.ietf.org/html/draft-ietf-oauth-pop-architecture . Este rascunho parece ser uma boa alternativa ao (abandonado?) Https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac .

Observe que, mesmo que essa RFC e as especificações acima estejam relacionadas ao protocolo OAuth2 Framework, elas podem ser usadas em qualquer outro contexto que exija uma troca de token entre um cliente e um servidor.

Diferente do JWTesquema personalizado mencionado na sua pergunta, o Bearerregistrado na IANA .

No que diz respeito aos esquemas de autenticação Basice Digest, eles são dedicados à autenticação usando um nome de usuário e um segredo (consulte RFC7616 e RFC7617 ), portanto não aplicável nesse contexto.

Florent Morselli
fonte
3
Obrigado! É bom ver a origem desta Bearerpalavra - chave. Mas vem do OAuth. No entanto, o JWT pode ser usado sem o OAuth. É totalmente independente das especificações do OAuth.
Zag zag ..
2
Sim, ele vem do protocolo da estrutura OAuth2, mas pode ser usado em qualquer outro contexto. Seu servidor é livre para aceitar o JWT usando outros cabeçalhos ou maneiras (por exemplo, na solicitação do corpo ou na cadeia de consulta), mas o Authenticatecabeçalho é mais apropriado e é compatível com o RFC7235, que descreve uma estrutura de autenticação em um contexto HTTP 1.1
Florent Morselli
1
Concordo com o Zag zag, um esquema personalizado como "JWT" ​​parece muito mais apropriado do que coagir o esquema OAuth2 Bearer a isso.
L8nite 02/12/2015
50
Essa deve ser a resposta aceita. Citando jwt.io/introduction : "o agente do usuário deve enviar o JWT, normalmente no cabeçalho da Autorização, usando o esquema do Portador. O conteúdo do cabeçalho deve ter a seguinte aparência: Autorização: Portador <token>"
wrschneider
3
Se isso ajuda alguém - eu vim aqui procurando este exemplo: - solicitação de ondulação usando o esquema Bearer:curl -H "Authorization: Bearer <TOKEN>" <the rest of your curl cmd>
Kevin Friedheim 6/17
76

Resposta curta

O Beareresquema de autenticação é o que você está procurando.

Resposta longa

Está relacionado aos ursos?

Errr ... Não :)

De acordo com os Dicionários de Oxford , aqui está a definição de portador :

portador / ˈbɛːrə /
substantivo

  1. Uma pessoa ou coisa que carrega ou segura alguma coisa.

  2. Uma pessoa que apresenta um cheque ou outro pedido para pagar dinheiro.

A primeira definição inclui os seguintes sinônimos: mensageiro , agente , transportador , emissário , transportadora , provedor .

E aqui está a definição de token do portador de acordo com a RFC 6750 :

1.2 Terminologia

Token do Portador

Um token de segurança com a propriedade de que qualquer parte em posse do token (um "portador") pode usá-lo de qualquer maneira que qualquer outra parte em posse dele. O uso de um token de portador não exige que o portador comprove a posse do material da chave criptográfica (prova de posse).

O Beareresquema de autenticação está registrado na IANA e originalmente definido no RFC 6750 para a estrutura de autorização do OAuth 2.0, mas nada impede você de usar o Beareresquema para tokens de acesso em aplicativos que não usam o OAuth 2.0.

Atenha-se aos padrões o máximo que puder e não crie seus próprios esquemas de autenticação.


Um token de acesso deve ser enviado no Authorizationcabeçalho da solicitação usando o Beareresquema de autenticação:

2.1 Campo do cabeçalho da solicitação de autorização

Ao enviar o token de acesso no Authorizationcampo de cabeçalho da solicitação definido por HTTP / 1.1, o cliente usa o Beareresquema de autenticação para transmitir o token de acesso.

Por exemplo:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM

[...]

Os clientes devem fazer solicitações autenticadas com um token de portador usando o Authorizationcampo de cabeçalho da solicitação com o Beareresquema de autorização HTTP. [...]

Em caso de token inválido ou ausente, o Beareresquema deve ser incluído no WWW-Authenticatecabeçalho da resposta:

3. O campo do cabeçalho de resposta WWW-Authenticate

Se a solicitação de recurso protegido não inclui credenciais de autenticação ou não contém um token de acesso que permita o acesso ao recurso protegido, o servidor de recursos DEVE incluir o WWW-Authenticatecampo de cabeçalho de resposta HTTP [...].

Todos os desafios definidos por esta especificação DEVEM usar o valor do esquema de autenticação Bearer. Este esquema deve ser seguido por um ou mais valores de parametros de autenticação. [...]

Por exemplo, em resposta a uma solicitação de recurso protegido sem autenticação:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example"

E em resposta a uma solicitação de recurso protegido com uma tentativa de autenticação usando um token de acesso expirado:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
                         error="invalid_token",
                         error_description="The access token expired"
cassiomolin
fonte
5
Sim. Está relacionado aos ursos. Da mesma maneira que o python está relacionado às cobras. Duh.
Nicholas Hamilton
4
Ursos .. É isso. Obrigado por fazer o meu dia.
user2501323
É uma vulnerabilidade se: eu der o token ao usuário, mas quando ele quiser me enviar uma solicitação, ele deverá enviar o token de volta no corpo da solicitação? Vou então tirá-lo e validar? Eu realmente não tenho outras opções, pois a maneira como elas enviam a solicitação não é definida por mim, mas eu estaria interessado se isso é ruim ou se há uma solução para torná-la mais segura.
Daniel Jeney