前言
鉴权的机制,分为四种:
- HTTP Basic Authentication (HTTP基本验证)
- session-cookie
- Token 令牌
- OAuth(开放授权)
HTTP Basic Authentication (HTTP基本验证)
过程解析:
- 客户端发送一个http请求,服务端验证用户是否已经登录验证过,如果没有就返回401 Unauthozied 状态码,并在响应首部字段
WWW-Authenticate
添加内容 - 浏览器在接受到401 Unauthozied后,会弹出登录验证的对话框。用户输入用户名和密码后, 浏览器用BASE64编码后,将认证信息放在请求首部字段
Authorization
中发送给服务器 - 服务器将Authorization中的用户名密码取出,进行验证, 如果验证通过,将根据请求,发送资源给客户端
- 当request第一次到达服务器时,服务器没有认证的信息,服务器会返回一个401 Unauthozied给客户端。 认证之后将认证信息放在session,以后在session有效期内就不用再认证了。
session-cookie
- 用户注册的时候,客户端提交用户名和密码,服务端会存储用户名和密码,为了防止被脱库,密码存储一般会进行加密存储,比如md5、rsa加密等
- 注册完成后,用户发起登录,客户端提交用户名和密码,服务端会对用户提交的数据进行校验(用户名就和密码是否正确),若正确服务端会根据用户信息(用户id,用户名,user_agent等)创建一个session,并存储在数据库中(一般是存储在redis中),保存好后,服务端会将这个session通过响应头的Set-cookie字段返回给客户端。
- 客户端收到服务器的响应,浏览器会自动将响应头Set-cookie的内容添加到请求头的cookie中(代码实现要手动添加,如果使用其他创建session的方式自动添加),在请求其他接口时会始终携带这个请求头。
- 服务端收到客户端发起的请求后,会从请求头中将session提取出来与之前存储在Redis中的session进行对比,如果一致就返回对应的接口数据给客户端,不一致或者是超时则不返回接口数据给客户端
session鉴权的缺点就是服务端存储压力较大,需要大量的存储空间来存储session,因此token鉴权应运而生
Token 令牌
- 用户发起登录,客户端提交用户名和密码,服务端会对用户提交的数据进行校验,校验通过以后此时会提取用户的关键信息(比如用户名密码、用户id、时间戳等信息进行排序,然后再进行签名运算)通过特定的算法生成token,然后将这个token放到响应头里面返回给客户端。
- 客户端收到响应结果,然后就会从响应结果中获取token(这个步骤是有前端工程师完成),然后将token放到请求头token字段中(通常情况是这个字段,由后端决定),再去请求其他接口
- 服务端再次收到客户端请求,此时服务端会去请求头中提取出token,然后对token进行解签,获取到用户关键信息,再去数据库查询是否存在该用户。但凡这个token被修改过,解签就会失败,鉴权就自然失败了。
- 服务端鉴权成功就会返回对应接口数据更黑客户端,鉴权失败就不会返回随影数据
OAuth(开放授权)
目前掌握第一种OAuth方式,即授权码方式即可。
总结
目前来说,常用的就是token令牌方式以及授权码方式。
对于普通的鉴权就是用token令牌方式,第三方登录就是常用OAuth授权码方式。