Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
chaijinsong opened this issue Mar 29, 2020 · 0 comments
Open

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

chaijinsong opened this issue Mar 29, 2020 · 0 comments

Comments

@chaijinsong
Copy link
Owner

鉴权-登录认证

文章目标

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

session-cookie方式

cookie原理解析

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

缺点:

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

代码实现:https://github.com/chaijinsong/node-study/tree/master/auth/cookie

session原理

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

缺点:

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

代码实现:https://github.com/chaijinsong/node-study/tree/master/auth/session

Token

过程回顾

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

代码实现:https://github.com/chaijinsong/node-study/tree/master/auth/token

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系统不需要走登录流程,就已经是登录状态了。

代码实现:https://github.com/chaijinsong/node-study/tree/master/auth/sso

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant