一:HTTP基本鉴权
1.客户端向服务器请求一个受限的列表数据或资源
2.服务器返回 401 状态码(未授权)以及附带提供了一个认证域 www-Authenticate: Basic realm="xxx.com"要求进行身份验证。
其中Basic 就是验证的模式,而 realm="baidu.com" 说明客户端需要输入这个安全域的用户名和密码,而不是其他域的
3.客户端将用户名及密码以 Base64 加密方式发送给服务器
4.校验成功,返回资源信息;校验失败,返回403禁止访问状态码
优点:简单,基本所有流行的浏览器都支持
缺点:基于 HTTP 传输,不安全
二:Session-Cookie鉴权
1.后端服务器将用户名密码映射一个sessionId进行缓存,并在响应头 Set-Cookie 中设置这个唯一标识符
2.客户端后续的每次访问都携带cookie,服务器获取cookie中的sessionId校验
优点:简单易用
缺点:浏览器禁用cookie就无法使用
三:JWT鉴权
JWT的Token由三部分组成:header.payload.signature
1.服务器获取用户名密码,会签发一个 Token 并把这个 Token 发送给客户端;
2.客户端后续的每次访问通过HTTP请求头authentication携带token,服务器解析token校验
优点:因为 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:开发者应用对结果进行处理后,呈现给用户
后端生成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情况下:重新登录
总结:
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;
- CAS 认证服务中心发现用户已登录,跳转回系统 B 的地址,并附上票据 (ST) ;
10系统B拿到票据 (ST),去 CAS 认证服务验证票据 (ST) 的有效性。验证成功后,客户端也可以跟系统 B 交往了 ~