JWT的最佳HTTP授权标头类型


228

我想知道JWT令牌最合适的AuthorizationHTTP标头类型是什么。

可能是最受欢迎的类型之一Basic。例如:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

它处理两个参数,例如登录名和密码。因此,它与JWT令牌无关。

另外,例如,我听说了Bearer类型:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

但是,我不知道它的含义。与熊有关吗?

在HTTP Authorization标头中是否有使用JWT令牌的特定方法?我们应该使用Bearer还是应该简化并仅使用:

Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

谢谢。

编辑:

或者,也许只是一个JWTHTTP标头:

JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Answers:


295

您的客户端发送访问令牌(JWT或任何其他令牌)的最佳HTTP标头是Authorization带有Bearer身份验证方案的标头。

该方案由RFC6750描述。

例:

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

如果需要更强的安全保护,还可以考虑以下IETF草案:https : //tools.ietf.org/html/draft-ietf-oauth-pop-architecture。该草稿似乎是(废弃)https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac的一个很好的替代方案。

请注意,即使此RFC和以上规范与OAuth2 Framework协议相关,它们也可以在需要客户端和服务器之间交换令牌的任何其他上下文中使用。

不像定制JWT你在你的问题提方案,Bearer一个在IANA注册

关于BasicDigest身份验证方案,它们专用于使用用户名和密码(请参阅RFC7616RFC7617)进行身份验证,因此不适用于该上下文。


3
谢谢!很高兴看到这个Bearer关键字的由来。但是它来自OAuth。但是,可以在没有OAuth的情况下使用JWT。它与OAuth规范完全独立。
Zag zag..15 /

2
是的,它来自OAuth2框架协议,但可以在任何其他上下文中使用。你的服务器是免费使用智威汤逊等标题或方式(在如人体的请求或查询字符串),以接受,但Authenticate头更合适,更符合的RFC7235,描述在一个HTTP 1.1范围内的认证框架
弗洛朗莫塞利

1
我同意Zag zag的观点,像“ JWT”这样的自定义方案似乎比强迫OAuth2 Bearer方案更合适。
l8nite 2015年

50
这应该是公认的答案。引用jwt.io/introduction:“用户代理通常应使用Bearer模式在Authorization标头中发送JWT。标头的内容应如下所示:Authorization:Bearer <token>”
wrschneider

3
如果它对某人有帮助-我来这里找这个例子:-使用Bearer方案进行卷曲请求:curl -H "Authorization: Bearer <TOKEN>" <the rest of your curl cmd>
Kevin Friedheim

76

简短答案

Bearer认证方案是你在找什么。

长答案

与熊有关吗?

Errr ... No :)

根据牛津字典,这是不记名的定义:

持票人 / ˈbɛːrə /
名词

  1. 携带或持有某物的人或物

  2. 出示支票或其他命令付款的人。

第一个定义包括以下同义词:MessengerAgent传送带EmissaryCarrierProvider

这是根据RFC 6750承载令牌的定义:

1.2。术语

不记名令牌

具有该令牌的任何一方(“承载者”)可以以任何其他任何拥有它的方可以使用的方式使用该令牌的属性的安全令牌。使用承载令牌不需要承载者证明拥有加密密钥材料(资产证明)。

Bearer认证方案登记在IANA和最初定义的RFC 6750的的OAuth 2.0授权框架,但没有阻止你使用Bearer的访问令牌方案在不使用OAuth 2.0的应用程序。

尽可能遵守标准,并且不要创建自己的身份验证方案。


必须Authorization使用Bearer身份验证方案在请求标头中发送访问令牌:

2.1。授权请求标头字段

当在AuthorizationHTTP / 1.1定义的请求标头字段中发送访问令牌时,客户端使用Bearer身份验证方案来传输访问令牌。

例如:

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

[...]

客户端应使用Authorization带有BearerHTTP授权方案的请求标头字段,使用承载令牌发出经过身份验证的请求。[...]

如果令牌无效或丢失,则该Bearer方案应包含在WWW-Authenticate响应头中:

3. WWW身份验证响应头字段

如果受保护的资源请求不包括身份验证凭据或不包含允许访问受保护资源的访问令牌,则资源服务器必须包含HTTP WWW-Authenticate响应头字段。

本规范定义的所有挑战都必须使用auth-scheme值Bearer。此方案必须跟随一个或多个auth-param值。[...]。

例如,响应未经身份验证的受保护资源请求:

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

并响应使用受保护的资源请求并使用过期的访问令牌进行身份验证尝试:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
                         error="invalid_token",
                         error_description="The access token expired"

5
是。它与熊有关。就像python与蛇相关。咄。
尼古拉斯·汉密尔顿,

4
熊..做到了。谢谢您度过我的快乐。
user2501323

是否存在以下漏洞:我给用户令牌,但是当他要向我发送请求时,他必须将令牌发送回请求正文中?然后,我将从那里获取并验证?我真的没有其他选择,因为它们发送请求的方式不是我定义的,但是如果这有什么不好或者是否有解决方案可以提高安全性,我将很感兴趣。
Daniel Jeney
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.