Http Basic 认证

688 阅读5分钟

Http Basic 认证

什么是 http basic 认证呢?

大家有没有碰到过这样的情况,在打开某个链接的时候,浏览器突然弹出一个输入框,要求你输入用户名和密码,如下图:

Untitled.png

这就是 Http Basic 认证…..

Http Basic 认证是一种最简单的身份验证方式。当我们通过浏览器访问资源的时候,如果服务器验证用户无权限访问资源。浏览器就会弹出需要用户输入 「用户名: 密码」 的输入框。以进行身份验证。

详细的过程:

  1. 当用户尝试访问受保护的资源时,服务器会返回HTTP状态码401(未经授权)。
  2. 服务器还会在响应头中包含一个名为 "WWW-Authenticate" 的字段,该字段指示浏览器使用 Basic 认证。
    在 Basic 认证中,服务器返回的响应头字段通常应该是 "WWW-Authenticate",这是 HTTP 规范中规定的标准字段名称。这是因为 "WWW-Authenticate" 是客户端识别服务器要求身份验证的标准方式。
    
    HTTP/1.1 中定义了 "WWW-Authenticate" 头字段的语法如下:
    WWW-Authenticate: <type> realm="<realm>"
    
    <type> 表示要使用的认证类型,对于 Basic 认证,这是 "Basic"。
    <realm> 是一个可读的描述性字符串,用于指定要求用户提供凭据的领域或领域的名称。
    
    在实际应用中,"WWW-Authenticate" 的值看起来像这样:
    WWW-Authenticate: Basic realm="Secure Area"
    
    Secure Area 可以自定义
    ps: realm="Secure Area" 是一个领域或区域的名称,用于描述要求用户提供凭据的区域。并没有实际意义。
  1. 浏览器收到 401 响应后,会弹出一个对话框要求用户输入用户名和密码。
  2. 用户输入用户名和密码后,浏览器会将这些凭据以Base64编码的形式添加到请求头中,并重新发送请求。
    用户输入用户名称和密码后
    
    浏览器会以这样的格式: "username:password" 将字符串Base64编码为后,将其添加到请求头的 "Authorization" 字段中。
  1. 服务器收到包含凭据的请求后,会解码Base64并验证用户名和密码是否正确。
  2. 如果用户名和密码正确,服务器将返回请求的资源;否则,它会返回401响应。

以上就是 Http Basic 认证的流程与细节。

Java 代码的简单示例

Java 后端服务器,我们采用 HttpServlet 的方式,只给出了核心部分的代码。

举例在 servlet filter 中,我们获取请求,认证失败,设置返回状态,要求进行 Http Basic 认证:

protected boolean doFilter(ServletRequest request, ServletResponse response, FilterChain var3) throws Exception {
  // ... 以上省略认证部分,假设认证失败了,需要返回认证失败的情况
  
  HttpServletResponse httpResponse = (HttpServletResponse)response;
  // 返回 401 未授权状态码,要求进行 Http Basic 认证
    httpResponse.setStatus(401);
    httpResponse.setHeader("WWW-Authenticate""Basic Realm=Token");
    httpResponse.getWriter().write("Unauthorized");
    
  // ... 以下省略
}

当用户访问未经过授权的资源的时候,认证不通过,代码将执行上面的示例部分,httpResponse 响应请求,浏览器就会弹出要求输入用户名称和密码的输入框。如下:

Untitled 1.png

Java后端我们又将收到请求,于是进行解析:


private String handle(ServletRequest request){
  HttpServletRequest servletRequest = (HttpServletRequest) request;
  // 获取请求头 Authorization 用户输入的用户名和密码
   Stirng value = servletRequest.getHeader("Authorization"); // 值:Basic 5byg5LiJOjEyMzQ1Ng==
    // 去除头
    value = value.replace("Basic """); // 值:5byg5LiJOjEyMzQ1Ng==
  // Base64 解码
    byte[] data = Base64.getDecoder().decode(value);
  return new String(data);  //值: 张三:123456
}

以上就是 Java 代码的简单实现。

总结

HTTP Basic 认证是一种简单的身份验证机制,具有一些优点和缺点,下面是它们的总结:

「优点:」

  1. 「简单和易于实施:」 HTTP Basic 认证非常简单,不需要复杂的配置或开发工作。这使得它容易在Web应用程序中实施和部署。
  2. 「广泛支持:」 HTTP Basic 认证是HTTP协议的一部分,几乎所有的Web浏览器和HTTP客户端都支持它,这意味着它可以与各种客户端和服务端互操作。
  3. 「适用于内部网络:」 它适用于内部网络环境,例如公司内部应用程序,因为在这些环境中安全性可能不是最重要的因素。

「缺点:」

  1. 「不安全的传输:」 HTTP Basic 认证的主要缺点是在传输过程中凭据以明文形式进行Base64编码,并不加密,容易被窃听。为了提高安全性,必须与HTTPS一起使用。
  2. 「凭据存储在客户端:」 客户端通常会存储用户名和密码,因此如果客户端被不当使用或被恶意访问,凭据可能会泄漏。
  3. 「不适用于公共网络:」 由于安全性较差,不建议在公共网络上使用HTTP Basic 认证,除非与其他安全措施结合使用,如HTTPS。
  4. 「无法提供多因素认证:」 HTTP Basic 认证只涉及用户名和密码,无法提供多因素认证的安全性。

总的来说,HTTP Basic 认证是一种简单但不太安全的身份验证方式,适用于内部网络环境或需要无状态通信的情况。但在公共网络上使用时,强烈建议与HTTPS一起使用以提供必要的加密和安全性。对于更高级的安全需求,可能需要考虑其他身份验证方式,如OAuth、JWT、或使用专门的身份验证协议。

更多内容欢迎关注小巫编程室公众号,喜欢文章的话,也希望能给小编点个赞或者转发,你们的喜欢与支持是小编最大的鼓励,小巫编程室感谢您的关注与支持。good good study day day up

qrcode_for_xiaowu.jpg