NutzCN Logo
问答 AccessTokenFilter 的问题不明白求指教
发布于 2855天前 作者 chafferer 1754 次浏览 复制 上一个帖子 下一个帖子
标签:

新版本里面有nonce 和 time 参数 来验证accesstoken,
但是nonce是随机数,time是时间,不是每次都会变化吗?
怎么会得出匹配的accesstoken,看了一下午了,还是不明白

11 回复

@qq_a930202f 这个我看了好几遍了,我还是不懂 [手动笑哭]

@wendal 是不是用了actionfilter 就不能用shiro的注解了?

服务器需要的是验证, 不是解码出token. 强调一下,是验证, 验证服务器端的token与客户端的token是否一致, 不是从客户端的请求中解码出token然后验证.根据设计好的算法, 是可以做到验证:

sign=sha1(nonce, timestamp, access_token, other_params)
// 这个算法的变量分别是: nonce, timestamp, access_token, other_params, 输出是sign.
// 这个算法要保证在nonce, timestamp, access_token, other_params相同的情况下, 总是输出同一个sign, 若其中任意一变量不同, 必须输出不同的sign.

// 只要服务器和客户端都知道上述变量的值, 就能得到一样的sign.
// nonce,timestamp, other_params, 对服务器端和客户端都是已知, 因为客户端会以**明文**发送到服务器端.
// 服务器端只剩下一个变量未知, access_token, 服务器要算出sign,就必须知道access_token,但客户端不能直接发access_token,所以,它发 额外参数,user id.
// 服务器端存在一个表, 保持了 user id与access_token的唯一对应关系. 根据客户端额外提供的user id, 服务器也得到了对应的access token.
// 至此, 服务器端知道了算法最后一个变量, access token, 的值, 与其他已知变量一同代入算法, 就算出了sign.

// 因为sign当且仅当所有变量均一致的情况下才会相等, 所以,当sign一致时, 我们可以确信客户端和服务器端计算sign时使用的nonce, timestamp, access_token, other_params均相等.
// 得证.

@wendal 这原理我能理解的,但是 nonce和timestamp 是每次都传递相同的值到后台吗?意思是前端要保存nonce和timestamp吗?
还是说,我在前端自己计算好sign, 服务器接收到参数也计算一下sign,再比较?

ps:是不是用了actionFilter 就不能用shiro的注解啊~

无论nonce和timestamp怎么变, 他们都是明文传, 都是已知变量, 对计算sign的算法不是未知变量.

为什么需要nonce, 为了防止请求被重放. 即中间人拦截请求的内容,原样请求一下, 要阻止这种行为.

为什么需要timestamp, 因为nonce不能永久保存.

为了确保nonce只能用一次, 服务器需要记住已经用过的nonce,但不可能永远保存, 所以,需要定义nonce的过期时间.

怎么办呢? 带上timestamp,让客户端告诉我们这是何时的请求,但又不能相信客户端, 所以拿服务器的本地时间, 与客户端提供的时间做差值, 看看是不是在合理的偏差内, 例如10分钟, 偏差超过10分钟,就reject掉.

考虑到客户端端可能比服务器快,也可能慢, 所以需要只需要确保 nonce在 正负10分钟的时间差之间是唯一,就可以了.

正负10分钟,就是20分钟咯, 所以设置nonce是过期时间在20分钟以上,就保证了一个时间段内是, nonce是唯一, 当超过该时间段的时候, 客户端与服务器器的时间戳肯定超出容忍值(10分钟).

timestamp和nonce用固定值? 所以你还是没理解, 或者是我还没说明白.

nonce是必须变的,每次都不一样, 每个nonce都只能用一次.

@wendal 那应该就是前端用那些变量计算出 key ,再把参数放到服务器去计算 跟自己计算出来的比较,我觉得这个应该就对了吧!
第一次登录前端从服务器获取来回accesstoken,每次访问跟那些变量一起计算,然后传递【计算结果】和【除了accesstoken的其他变量】服务器,服务器从表里面通过userid 或者username 取出accesstoken,然后计算,跟前端的计算结果比较,相等即通过~
敲出我自己的理解希望能帮到其他跟我一样不明白的人
谢谢兽总~

这里说的客户端不是浏览器, 那段代码是给安卓/ios客户端用的, access token是扫二维码的方式读到客户端内的.

你说的key,我猜指的是access token.

@wendal 我说的key, 是计算出来的sign啊, access token 在之后的访问就不在上传了

恩, 那就对了

添加回复
请先登陆
回到顶部