后端鉴权方式总结 + 代码实践

2,460 阅读3分钟

鉴权-登录认证

文章目标

  • 掌握三种常见的鉴权方式
    • Session/Cookie
    • Token
    • SSO(单点登录)

session-cookie方式

cookie原理解析

就是浏览器独有的一个特性,即每次发送请求都会在header中带上cookie这个请求头,所以可以用来保存一些信息,后端通过设置 Set-Cookie 请求头来给客户端设置cookie。

缺点:

  • 存储空间不够大
  • 不够安全,客户端能够拿到cookie

代码实现:github.com/chaijinsong…

session原理

由于cookie不能放敏感信息,并且存储空间不够大。所以可以考虑在后端存储,那么在cookie中存储的其实是一个key,后端接收到请求后通过cookie拿到key,然后去session对象中去拿对应的值。这样就在服务端保存了用户的状态信息,并且客户端也拿不到敏感信息。

缺点:

  • 还是一个有状态的服务
    • 比如用redis去存储了状态
  • 不灵活:
    • 如果是APP该怎么办,app没有cookie机制,只有浏览器中有cookie机制
    • 跨域怎么办

代码实现:github.com/chaijinsong…

Token

过程回顾

  • 用户登录的时候,服务端生成一个token返回给客户端
  • 客户端后续的请求都带上这个token
  • 服务端解析token获取用户信息,并响应用户的请求
  • token会有过期时间,客户端登出的时候也会废弃token,但是服务端不需要任何操作

代码实现:github.com/chaijinsong…

JWT(JSON WEB TOKEN) 原理解析

  1. Bearer Token 包含三个组成部分:令牌头、payload、哈希,他们用 . 来隔开

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoidGVzdCIsImV4cCI6MTU4NTQ5NjY0NCwiaWF0IjoxNTg1NDkzMDQ0fQ.Y2Vst5n9-wFXx_UhvEIsjRuMiDFOZF-ZqxdAICmA13I

其中令牌头和 payload 是固定的内容,后面的哈希值则是根据``令牌头 和 payload+secret `生成的hash,所以在鉴权的时候,如果令牌头和 payload 被修改,那么和最后的hash值是不对应的,算是鉴权失败

SSO 单点登录

过程:

  1. 用户访问app系统,app系统需要登录,此时用户没有登录
  2. 跳转到 sso 登录系统,sso登录系统也没有登录,此时弹出用户登录页面
  3. 用户填写用户名密码,sso系统认证后,将登录状态写入sso的session中,浏览器中写入sso域名下的cookie
  4. sso系统登录完成后生成一个 token,然后跳转到 app 系统。将token作为参数传给 app 系统
  5. app系统拿到 token 后,从后台向sso系统发送请求,验证 token 是否有效
  6. 验证通过后,app系统将登录状态写入session,并设置app域名下的cookie

至此,跨域单点登录就完成了,以后我们再次访问app系统时,app就是登录的。接下来看访问 app2系统时的流程

  1. 用户访问 app2 系统,app2 系统没有登录,跳转到 sso 系统进行登录
  2. 跳转到 sso 登录页面后,发现sso系统域名下存在cookie,说明sso系统已经处于登录状态了,不需要重新登录认证
  3. sso系统生成 token,浏览器跳转到 app2 系统,并将token作为参数传递给app2
  4. app2拿到token,后台访问 sso 验证token是否有效
  5. 验证成功后,app2将登录状态写入session,并且在app2域名下设置cookie

这样app2系统不需要走登录流程,就已经是登录状态了。

代码实现:github.com/chaijinsong…