在基本身份验证中,是否需要在任何请求中传递用户名和密码组合?

3

我对基本的HTTP授权感到困惑。是需要在每个请求中都发送 Authorization 头部,还是只需要在第一个请求中发送一次并让浏览器记住授权令牌,就像会话ID一样?


取决于服务器是否具有会话持久性。这不是基本身份验证规范的一部分。 - Boris the Spider
是的。如果没有提供,浏览器会为您执行。然而,它总是针对每个请求传递的。 - daparic
3个回答

2

每次请求都需要发送Authorization头信息。但例如Chrome会记住授权令牌并在每次请求时自动发送。


1
使用基本身份验证,每个请求都需要在格式为Authorization的HTTP头中具有身份验证信息。
Authorization: Basic <base64(username:password)>

在这里,用户名和密码会使用冒号(“:”)连接起来,然后生成的字符串进行 base64编码

如果授权头不是请求的一部分,或者其中的凭据无效,则服务器应该以HTTP 401未经授权响应作出回应,并包括类似于以下的HTTP头:

WWW-Authenticate: Basic realm="myRealm"

基本认证是一种隐式身份验证方案,因此用户输入有效凭据后,浏览器将在每个页面请求中发送它们。

对于 AJAX 请求,您需要从代码中附加此标头。然而,您真的不应该使用基本认证来保护 API,原因如下:

  1. 您会强制客户端在代码中保存这些凭据,这样它们很容易被盗取。
  2. 您必须使用 HTTPS 与基本认证,因为 base64 编码根本不保护凭据。
  3. 用户名/密码组合通常比访问令牌有效期更长,因此如果它们被盗取,风险就会增加。
  4. 密码验证应该是一个缓慢的过程,以减轻暴力攻击的风险,而令牌验证只是验证数字签名。
  5. 每次都必须通过网络发送用户名/密码,这增加了某个人试图破解加密的攻击面。
更好的保护Web API的替代方案是基于令牌的身份验证方案,如OAuth2,或基于HMAC的身份验证方案,如Hawk或AWS。token based authentication schemes OAuth2 Hawk AWS

0

没错,第一次用户登录时,会对其凭据进行验证,如果正确,则生成一个授权令牌。

授权令牌是一个自包含实体(其中存储了一些使用密钥签名的数据)

此令牌与刷新令牌一起存储在客户端(通常是在客户端存储)

对于所有后续请求,此令牌都保留在授权标头中(Bearer + token)

当服务器接收到此令牌时,它使用先前用于签署该令牌的密钥对其进行解密。并使用存储的数据

如果授权令牌已过期,则使用刷新令牌。

以下是一些链接 OAuth 2的高级别工作原理 和jwt.io以获取有关令牌的感觉


2
问题是关于基本身份验证。你的答案是关于令牌式身份验证。这两个完全不同。 - MvdD
看起来你是正确的,从你的回答中学到了一些东西,谢谢。 - Aishwat Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接