1. 初识Basic access authentication

用户登录在术语中更多的称为用户认证,英文单词以authentication为关键字,日常应用中也常常被简写为auth。认证的方式有很多种,比如我们常看到的用户名密码认证、手机号验证码认证、使用微信支付宝等第三方快捷认证等。

在此,我们仅讲述最简单的使用用户名密码的认证方式。即使是这样,使用用户名密码完成认证的方式也有很多种。

比如最容易理解的将用户名、密码以 FORM 表单的格式发送给后台,然后后台解析 FORM 表单。

在前后台分离的应用中,还可以使用非 GET 的方式向后台发起 http 请求,并在请求主体中加入{username: string, password: string}的格式的认证信息。

image.png

但在请求的主体中加入用户认证信息并不是一个好的主意,这是由于http协议中的主体只有一个,如果这个主体携带了用户认证信息,便不能够更灵活的携带其它的信息。虽然在大多数情况下用户都会先完成登录,然后再去访问其它的资源。但也不排除某些请求(往往不是web终端,比如第三方应用)想在访问任意资源时都带入用户的认证信息。

为了解决访问任意资源都可以携带认证信息,我们还可以将用户名、密码加入到header中,这样以来在任何前台的请求中便都可以加入用户名、密码了。

image.png

其实大牛们老早就发现了这个问题,并且给出了初步的解决方案,那就是Basic access authentication,有时也被简称为Basic Auth

Basic Auth

Basic Auth,顾名思义其为一种基本的认证模式,它也是最常用的HTTP认证方案。它的基本认证逻辑是:将认证信息中的用户名密码拼接起来,然后进行一次转码,最后将其放到Http请求的Header中。

encode常被译为加密,其实这种根据原理任意人都可以解密的加密,被称为转码应该更确切一些。

以用户名为zhangsan密码为yunzhi.club为例,使用Basic Auth认证流程如下:

  1. 将用户名密码与:相连,则接拼为字符串zhangsan:yunzhi.club
  2. 将拼拼后的字符串使用base64进行转码base64(zhangsan:yunzhi.club),转码结果为emhhbmdzYW46eXVuemhpLmNsdWI=
  3. 在http请求中的headers中Authorization项,其值为Basic + 第2步的转码结果: Basic emhhbmdzYW46eXVuemhpLmNsdWI=
  4. http 请求携带该header向后台发起请求
除最常用的Basic认证外,还有BearerDigestHOBA等认证模式。

base64

base64是一种将二进制与字符串互转的转码算法,它与著名的ASCII编码类似,也是一种转码算法。

ASCII编码将每8个二进制看成一组,并将其转换为对应的字符(或者将每个字符转换为对应的8个二制制数)。

image.png

则参考上表abcd将被转换为61626364H,对应的二进制为01100001011000100110001101100100b

而Base64编码是将6个二进制看成一组,并将其转换为对应的字符(或者是将一个字符转换为对应的6个二进制数)。

image.png

则参考上表abcd将被转换为011010011011011100011101