鉴权-登录认证
文章目标
- 掌握三种常见的鉴权方式
- Session/Cookie
- Token
- SSO(单点登录)
session-cookie方式
cookie原理解析
就是浏览器独有的一个特性,即每次发送请求都会在header中带上cookie这个请求头,所以可以用来保存一些信息,后端通过设置 Set-Cookie
请求头来给客户端设置cookie。
缺点:
- 存储空间不够大
- 不够安全,客户端能够拿到cookie
session原理
由于cookie不能放敏感信息,并且存储空间不够大。所以可以考虑在后端存储,那么在cookie中存储的其实是一个key,后端接收到请求后通过cookie拿到key,然后去session对象中去拿对应的值。这样就在服务端保存了用户的状态信息,并且客户端也拿不到敏感信息。
缺点:
- 还是一个有状态的服务
- 比如用redis去存储了状态
- 不灵活:
- 如果是APP该怎么办,app没有cookie机制,只有浏览器中有cookie机制
- 跨域怎么办
Token
过程回顾
- 用户登录的时候,服务端生成一个token返回给客户端
- 客户端后续的请求都带上这个token
- 服务端解析token获取用户信息,并响应用户的请求
- token会有过期时间,客户端登出的时候也会废弃token,但是服务端不需要任何操作
JWT(JSON WEB TOKEN) 原理解析
- Bearer Token 包含三个组成部分:令牌头、payload、哈希,他们用 . 来隔开
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoidGVzdCIsImV4cCI6MTU4NTQ5NjY0NCwiaWF0IjoxNTg1NDkzMDQ0fQ.Y2Vst5n9-wFXx_UhvEIsjRuMiDFOZF-ZqxdAICmA13I
其中令牌头和 payload 是固定的内容,后面的哈希值则是根据``令牌头 和 payload+
secret `生成的hash,所以在鉴权的时候,如果令牌头和 payload 被修改,那么和最后的hash值是不对应的,算是鉴权失败
SSO 单点登录
过程:
- 用户访问app系统,app系统需要登录,此时用户没有登录
- 跳转到 sso 登录系统,sso登录系统也没有登录,此时弹出用户登录页面
- 用户填写用户名密码,sso系统认证后,将登录状态写入sso的session中,浏览器中写入sso域名下的cookie
- sso系统登录完成后生成一个 token,然后跳转到 app 系统。将token作为参数传给 app 系统
- app系统拿到 token 后,从后台向sso系统发送请求,验证 token 是否有效
- 验证通过后,app系统将登录状态写入session,并设置app域名下的cookie
至此,跨域单点登录就完成了,以后我们再次访问app系统时,app就是登录的。接下来看访问 app2系统时的流程
- 用户访问 app2 系统,app2 系统没有登录,跳转到 sso 系统进行登录
- 跳转到 sso 登录页面后,发现sso系统域名下存在cookie,说明sso系统已经处于登录状态了,不需要重新登录认证
- sso系统生成 token,浏览器跳转到 app2 系统,并将token作为参数传递给app2
- app2拿到token,后台访问 sso 验证token是否有效
- 验证成功后,app2将登录状态写入session,并且在app2域名下设置cookie
这样app2系统不需要走登录流程,就已经是登录状态了。