常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别。
session
token
业界常用的授权标准有两种,一种是使用auth2,这种方式更适合于类似第三方授权登录,比如微信、微博、QQ信任登录业务。另一种是oauth,即第三方无需知道用户和密码就可以申请获得该资源的授权,更适用于对用户的权限校验并分配访问权限,比如常见的登录后分配可见资源(按钮、菜单等)类型网站。
Javashop电商系统 采用的是oauth方式的鉴权标准。我们以系统的应用为例来介绍oauth的方案。
1 登录
服务端校验密码,成功后返回access_token和refresh_token,客户端记录上述token。
2 访问API
在访问API之前解析access_token,并且查看是否过期,如果不过 期则请求API,如果过期,则要刷新令牌,在请求API。
3 刷新token
携带有效期的refresh_token换回有效token,如果refresh_token过期,则需要用户重新登录。
4 注销
请求注销api,服务器端和客户端应同时删除token的存储。
1 客户端请求API
携带access_token信息,如果生成环境不会直接携带access_token,会使用加密后的签名校验。祥见以下防重放机制。
2 获取token
根据环境不同而有不同的获取token方式。
3 解析token
通过JWT工具将token解析。
4 由redis读取token
根据uid拼接key读取access_token, 如果不存在这个用户的token说明已经登出。
5 验证token
判断次token是否属于此uid,判断token是否过期,如果过期则进行以下刷新token的流程。
6 注入权限
如果token验证成功,根据user信息生成权限注入到spring安全上下文中。
1 客户端请求API
携带refresh_token,如果是生产环境不会直接携带refresh_token信息,详见以下防重放攻击。
2 获取token
根据环境不同而有不同的获取token方式。
3 解析token
通过JWT工具将token解析。
4 token读取
根据uid拼接key读取出access_token,如果不存在这个用户的token说明用户已经登出。
5 验证token
判断此token是否属于此uid,判断token是否已经过期,如果过期,则返回refresh_token过期错误,此时用户需要重新登录。
6 刷新token
如果refresh_token 验证成功,则重新生成access_token和refresh_token,上述有效期以当前时间向后计算,替换此用户在redis中的token,并将token返回给客户端。
一、 参数的读取
1 在生产环境时,不能直接传递token,而是要传递签名数据,服务器端验签后由Redis中获取签名。
2 如果是非生产环境,直接由header中读取token。
二、 生产环境传递如下参数
memberid (用户id)
nonce(随机字串,6位)
timestamp(当前时间戳,到秒)
sign= md5( uid+ nonce + timestamp +token )
三、 验证逻辑
1 验证时间戳
判断时间戳是否起过60s,大于60s则判别为重放功击。
2 验证nonce
首先验证nonce在 reids中是否存在,如果存在,则判别为重放功击,否则将nonce记录在redis中(key为:"nonce"+uid+"_"+nonce),失效时间为60s。
3 验证sign
md5( uid+ nonce + timestamp +token ) 验证是签名是否通过。
4 验证token
通过uid拿到token ,验证逻辑同验权流程。
当然在不同的业务场景下实现方案是多种多样的,仅以此方案抛转引玉,供大家参考。
1 最近得到一个新需求,需要在后台管理页面加上用户权限控制,通过后台放在cookie里面的token进行判断;
2 获取cookie里面的token:
21 我们在用vuejs里面的indexhtml写一个全局的函数:
3 这样我们通过传入cookie的key名就可以获取到后面的token了,如:
接口跳转时,可以将token作为url中的一个参数传递,以便其他页面能够获取到该token,从而识别用户和授权信息。常见的做法是将token加密后传递,在接收方进行解密处理。例如,假设要跳转到目标页面时,需要在url中传递token参数,可以按照以下步骤进行处理:1 在登录时生成一个token,在服务器端保存该token和用户信息的对应关系。2 在跳转时将token加密后添加到url的参数中。3 在目标页面中获取url中的token参数,并通过解密算法获取用户信息。可以选择将用户信息存储到本地或从服务器端获取。注意,为了保证token的安全性,需要采取一定的安全措施,如限制token的时效性、设置访问次数限制、加密token等,以防止token泄露或被恶意利用。在实现过程中,建议参考相关的安全规范和最佳实践。
1
提取登录接口中的token值 添加边界提取器,获取token值,填写引用名称
2
使用_setProperty函数设置为全局变量 添加BeanShell PostProcessor,打开函数助手使用_setProperty函数,填写要设置的全局变量名称及要将哪个变量设置为全局变量,将函数助手生成的结果复制到BeanShell PostProcessor
3
使用函数助手_property获取全局变量 打开函数助手使用_property函数,填写全局变量名称及存储结果的变量名,点击生成复制结果
4
将复制的结果添加到下一个线程组的信息头管理器作为全局使用即可
以上就是关于基于token机制鉴权架构全部的内容,包括:基于token机制鉴权架构、js获取cookie里面的token、接口跳转时设置token等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)