它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?
Posted
技术标签:
【中文标题】它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?【英文标题】:Does it needs to pass username:password combination in any request with basic auth?它是否需要在任何具有基本身份验证的请求中传递用户名:密码组合? 【发布时间】:2015-12-25 00:07:03 【问题描述】:我对基本的 http 授权感到困惑。需要将每个请求发送到带有Authorization
标头的服务器,或者只是第一个请求,然后浏览器记住身份验证令牌,如会话ID?
【问题讨论】:
取决于服务器是否具有会话持久性。这不是基本身份验证规范的一部分。 是的。如果未提供,浏览器会为您执行此操作。然而,它总是为每个请求传递。 【参考方案1】:您必须在每个请求上发送 Authorization 标头。但例如 Chrome 会记住身份验证令牌并在每次请求时自动发送。
【讨论】:
【参考方案2】:使用基本身份验证,每个请求都需要有一个Authorization
HTTP 标头,格式为:
Authorization: Basic <base64(username:password)>
用户名和密码使用冒号 (':') 连接,结果字符串为 base64 encoded。
如果 Authorization 标头不是请求的一部分,或者里面的凭据无效,则服务器应使用 HTTP 401 Unauthorized 响应进行响应,并包含如下 HTTP 标头:
WWW-Authenticate: Basic realm="myRealm"
基本身份验证是implicit authentication scheme,因此在用户输入有效凭据后,浏览器会将它们与每个页面请求一起发送。
对于 AJAX 请求,您需要从代码中附加此标头。但是,您确实不应该使用基本身份验证来保护 API,原因有很多:
-
您会强制客户端将这些凭据保存在代码中,这样很容易被窃取。
您必须使用带有基本身份验证的 HTTPS,因为 base64 编码根本无法保护凭据。
用户名/密码组合的有效时间通常比访问令牌长得多,因此如果它们被盗,会增加风险。
密码验证应该是一个缓慢的过程来缓解暴力攻击,其中令牌验证只是验证数字签名。
每次都必须通过网络发送用户名/密码会增加试图破解加密的人的攻击面。
保护 Web API 的更好替代方法是 token based authentication schemes,如 OAuth2 或基于 HMAC 的身份验证方案,如 Hawk 或 AWS
【讨论】:
【参考方案3】:没错,所以当用户第一次登录时,他的凭据会根据一些数据进行验证,如果正确,则会生成一个身份验证令牌。
身份验证令牌几乎是一个自包含的实体(它存储一些用密钥签名的数据)
此令牌在客户端获取存储(通常与刷新令牌一起) 对于所有后续请求,此令牌保存在 Authorization header(Bearer+token)
当服务器接收到这个令牌时,它会使用之前用来签署该令牌的密钥对其进行解密。并使用存储的数据
如果该身份验证令牌已过期,则刷新令牌开始发挥作用。
一些链接开始 On a high level, how does OAuth 2 work? 和 jwt.io 来获得令牌的感觉
【讨论】:
问题是关于基本身份验证。您的答案是关于基于令牌的身份验证。这是完全不同的两件事。 看来你是对的,从你的回答中学到了一些东西,谢谢以上是关于它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?的主要内容,如果未能解决你的问题,请参考以下文章
具有基本身份验证的 Angular 7 HTTP 请求 [关闭]