2000字带你搞懂后端鉴权

150 阅读5分钟

一:HTTP基本鉴权

1.客户端向服务器请求一个受限的列表数据或资源

2.服务器返回 401 状态码(未授权)以及附带提供了一个认证域 www-Authenticate: Basic realm="xxx.com"要求进行身份验证。

其中Basic 就是验证的模式,而 realm="baidu.com" 说明客户端需要输入这个安全域的用户名和密码,而不是其他域的

3.客户端将用户名及密码以 Base64 加密方式发送给服务器

4.校验成功,返回资源信息;校验失败,返回403禁止访问状态码

图片1.png

优点:简单,基本所有流行的浏览器都支持

缺点:基于 HTTP 传输,不安全

 

二:Session-Cookie鉴权

1.后端服务器将用户名密码映射一个sessionId进行缓存,并在响应头 Set-Cookie 中设置这个唯一标识符

2.客户端后续的每次访问都携带cookie,服务器获取cookie中的sessionId校验

图片2.png 优点:简单易用

缺点:浏览器禁用cookie就无法使用

 

三:JWT鉴权

JWT的Token由三部分组成:header.payload.signature

1.服务器获取用户名密码,会签发一个 Token 并把这个 Token 发送给客户端;

2.客户端后续的每次访问通过HTTP请求头authentication携带token,服务器解析token校验

图片3.png 优点:因为 Cookie 是不允许跨域访问的,而 JWT则不存在这个问题;后端无需像session-cookie方案将用户信息保存到后台

缺点:当更换用户密码的时候,需要等前端的token过期之后才能生效

 

四:OAuth鉴权

授权模式

1.授权码模式 授权码模式(authorization code)是功能最完整、流程最严密的授权模式

2.简化模式 有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤

3.密码模式 如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌

4.客户端模式 适用于没有前端的命令行应用,即在命令行下请求令牌

 

整体流程

1-2:用户在Web登录方式中选择使用“华为帐号”方式登录,开发者应用发起授权码Code请求。

3:华为帐号服务器呈现授权页面给用户,用户登录后,确认授权。

4:华为帐号服务器通过开发者应用配置的回调地址,返回授权码Code。

5:开发者应用发起Code换Token请求。

6:华为帐号服务器返回Access Token、用户信息(ID Token)。

7-8:开发者应用通过Access Token调用华为公开API,华为帐号服务器返回结果。

9:开发者应用对结果进行处理后,呈现给用户

图片4.png

后端生成accessToken与thirdToken过期时长比较

情况一:accessToken比thirdToken提前过期(accessToken:20min  thirdToken:30min)

(1)不刷新accessToken:用户一直登录的情况下,accessToken过期,被迫退出登录(不可取)

(2)刷新accessToken:引入延时队列来感知临界过期时间,复杂度高(不可取)

情况二:thirdToken比accessToken提前过期(accessToken:60min  thirdToken:30min)

(1)不刷新accessToken:用户一直登录的情况下,accessToken过期,被迫退出登录(不可取)

(2)刷新accessToken:(可取)

1.20min情况下:网关调用check接口发现thirdToken未过期,刷新10s缓存

2.40min情况下:网关调用check接口发现thirdToken过期,调用refresh接口延长thirdToken和accessToken的过期时间,并且刷新10s缓存

3.70min情况下:重新登录

图片5.png

 

总结:

1.在调用check接口时,为防止大量的请求到第三方获取用户信息接口,中间加一个10s左右的redis,优先从缓存中获取

3.我们需要根据第三方的w3access_token加密一个服务端的access_token存到redis,并返回给前端设置到请求头。(防止拿到第三方w3access_token去获取信息)

服务端token生成的过期时间要比三方过期时间要长

 

五:SSO鉴权

单点登录下的CAS认证步骤详解:

1.客户端开始访问系统A;

2.发现用户未登录,重定向至CAS认证服务(sso.com),同时 URL 地址参数携带登录成功后回跳到系统 A 的页面链接(sso.com/login?redir…

3.CAS认证服务发现请求 Cookie 中没有携带登录的票据凭证(TGC),所以 CAS 认证服务判定用户处于 未登录 状态,重定向用户页面至 CAS 的登录界面,用户在 CAS 的登录页面上进行登录操作。

4.客户端输入用户名密码进行 CAS 系统认证;

5.CAS认证服务校验用户信息,并且 生成 TGC 放入自己的 Session 中,同时以 Set-Cookie 形式写入 Domain 为 sso.com 的域下 ;同时生成一个 授权令牌 ST (Service Ticket) ,然后重定向至系统 A 的地址,重定向的地址中包含生成的 ST(重定向地址:www.taobao.com?token=ST-345678)

6.系统A拿着 ST 向 CAS 认证服务发送请求,CAS 认证服务验证票据 (ST) 的有效性。验证成功后,系统 A 知道用户已经在 CAS 登录了(其中的 ST 可以保存到 Cookie 或者本地中),系统 A 服务器使用该票据 (ST) 创建与用户的会话,称为局部会话,返回受保护资源;

7.客户端开始访问系统 B;

8.系统B发现用户未登录,重定向至 SSO 认证服务,并将自己的地址作为参数传递,并附上在 sso.com 域下的 cookie 值是第五步生成的 TGC;

  1. CAS 认证服务中心发现用户已登录,跳转回系统 B 的地址,并附上票据 (ST) ;

10系统B拿到票据 (ST),去 CAS 认证服务验证票据 (ST) 的有效性。验证成功后,客户端也可以跟系统 B 交往了 ~

图片6.png