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

时间:2015-09-27 18:21:44

标签: java http authentication basic-authentication

我对基本的http授权感到困惑。需要将每个请求发送到具有Authorization标头的服务器或仅发送第一个请求,然后在该浏览器之后重新启动身份验证令牌,如会话ID?

3 个答案:

答案 0 :(得分:1)

您必须在每个请求上发送Authorization标头。但是,例如Chrome会记住身份验证令牌并在每次请求时自动发送。

答案 1 :(得分:1)

是的,这是正确的,因此,当用户首次登录时,会根据某些数据验证其凭据,如果正确,则会生成身份验证令牌。

Auth令牌几乎是一个自包含的实体(存储一些用密钥签名的数据)

此令牌在客户端获取存储(通常与刷新令牌一起) 对于所有后续请求,此令牌保留在授权标头(承载+令牌)

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

如果该身份验证令牌已过期,则刷新令牌开始起作用。

开头的一些链接 On a high level, how does OAuth 2 work? 和jwt.io一起获得令牌的感觉

答案 2 :(得分:0)

使用基本身份验证,每个请求都需要格式为Authorization的HTTP标头:

Authorization: Basic <base64(username:password)>

其中用户名和密码使用冒号连接(&#39;:&#39;),结果字符串为base64 encoded

如果Authorization标头不是请求的一部分,或者内部的凭据无效,则服务器应响应HTTP 401 Unauthorized响应并包含HTTP标头,如:

WWW-Authenticate: Basic realm="myRealm"

基本身份验证是implicit authentication scheme,因此在用户输入有效凭据后,浏览器会将其与每个页面请求一起发送。

对于AJAX请求,您需要从代码中附加此标头。但是,您确实不应使用基本身份验证来保护API ,原因如下:

  1. 您强制客户端将这些凭据保存在代码中,以便轻松窃取。
  2. 您必须将HTTPS与基本身份验证一起使用,因为base64编码根本不提供对凭据的保护。
  3. 用户名/密码组合的有效期通常比访问令牌长,因此如果被盗则会增加风险。
  4. 密码验证应该是缓解暴力攻击的缓慢过程,其中令牌验证只是验证数字签名。
  5. 每次都要通过网络发送用户名/密码会增加试图破解加密的人的攻击面。
  6. 保护网络API的更好替代方案是token based authentication schemes,例如OAuth2或基于HMAC的身份验证方案,例如HawkAWS