1. 初识Basic access authentication
用户登录在术语中更多的称为用户认证,英文单词以authentication
为关键字,日常应用中也常常被简写为auth
。认证的方式有很多种,比如我们常看到的用户名密码认证、手机号验证码认证、使用微信支付宝等第三方快捷认证等。
在此,我们仅讲述最简单的使用用户名密码的认证方式。即使是这样,使用用户名密码完成认证的方式也有很多种。
比如最容易理解的将用户名、密码以 FORM 表单的格式发送给后台,然后后台解析 FORM 表单。
在前后台分离的应用中,还可以使用非 GET 的方式向后台发起 http 请求,并在请求主体中加入{username: string, password: string}
的格式的认证信息。
但在请求的主体中加入用户认证信息并不是一个好的主意,这是由于http协议中的主体只有一个,如果这个主体携带了用户认证信息,便不能够更灵活的携带其它的信息。虽然在大多数情况下用户都会先完成登录,然后再去访问其它的资源。但也不排除某些请求(往往不是web终端,比如第三方应用)想在访问任意资源时都带入用户的认证信息。
为了解决访问任意资源都可以携带认证信息,我们还可以将用户名、密码加入到header中,这样以来在任何前台的请求中便都可以加入用户名、密码了。
其实大牛们老早就发现了这个问题,并且给出了初步的解决方案,那就是Basic access authentication
,有时也被简称为Basic Auth
。
Basic Auth
Basic Auth,顾名思义其为一种基本的认证模式,它也是最常用的HTTP认证方案。它的基本认证逻辑是:将认证信息中的用户名密码拼接起来,然后进行一次转码
,最后将其放到Http请求的Header中。
encode常被译为加密
,其实这种根据原理任意人都可以解密的加密
,被称为转码
应该更确切一些。
以用户名为zhangsan
密码为yunzhi.club
为例,使用Basic Auth认证流程如下:
- 将用户名密码与
:
相连,则接拼为字符串zhangsan:yunzhi.club
。 - 将拼拼后的字符串使用base64进行转码
base64(zhangsan:yunzhi.club)
,转码结果为emhhbmdzYW46eXVuemhpLmNsdWI=
。 - 在http请求中的headers中
Authorization
项,其值为Basic
+ 第2步的转码结果:Basic emhhbmdzYW46eXVuemhpLmNsdWI=
- http 请求携带该header向后台发起请求
除最常用的Basic认证外,还有Bearer、Digest、HOBA等认证模式。
base64
base64是一种将二进制与字符串互转的转码算法,它与著名的ASCII编码类似,也是一种转码算法。
ASCII编码将每8个二进制看成一组,并将其转换为对应的字符(或者将每个字符转换为对应的8个二制制数)。
则参考上表abcd
将被转换为61626364H
,对应的二进制为01100001011000100110001101100100b
而Base64编码是将6个二进制看成一组,并将其转换为对应的字符(或者是将一个字符转换为对应的6个二进制数)。
则参考上表abcd
将被转换为011010011011011100011101