用户身份验证的令牌——Token - 知乎首发于人工智能大数据学习交流切换模式写文章登录/注册用户身份验证的令牌——Token企通查北京奥德塔数据科技有限公司Token是什么?所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。图:来源于网络拿实际过程举例,当你下载QQ或微信后第一次用账号和密码成功登录后,Token就为我们免去了每次打开应用都要输入账号跟密码的过程。为什么要使用Token?为什么要使用Token?这个问题其实很好回答——因为它能解决问题!当下用户对产品的使用体验要求在逐渐提高,从产品体验方面来讲,Token带来的体验更容易能让用户接受。那么Token都可以解决哪些问题呢?Token具有随机性、不可预测性、时效性、无状态、跨域等特点。 Token完全由应用管理,所以它可以避开同源策略Token可以避免CSRF攻击Token可以是无状态的,可以在多个服务间共享Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。当然说到这里大家可能会想到,用服务器的session_id存储到cookies中也能做到,为什么非要用Token呢?网上有许多对比Token和session的文章,在此就不再赘述。其实小编觉得,如果是开发web应用的话,用两者都可以,但如果是开发API接口,前后端分离,最好使用Token,因为session+cookies是基于web的,但针对API接口可能会考虑到移动端,app是没有cookies和session的。Token的生命周期1)用户未登录用户执行注册/登录→一旦基础数据校验成功,后端生成Token,并且Token包含此次注册/登录用户的用户名并通过JsonResponse返回给前端→前端拿到返回的Token后,存入浏览器本地存储2)用户每次访问博客页面从本地存储中拿出Token→JS将Token 放入request的Authorization头,发送http请求向后端索要数据→服务器接到前端请求(当前URL加了loging_check,并且请求方法在methods参数中),进行校验→从requestAuthorization头拿出Token→校验→校验不通过,返回前端异常代码/校验通过,正常执行对应的视图函数→前端一旦接到关于Token的异常码,则删除本地存储中的Token,且将用户转至登录界面。如何设置Token的有效期?其实Token作为一个概念模型,开发者完全可以针对自己开发的应用自定义Token,只要能做到不让不法分子钻系统漏洞即可。那么为Token设置有效期还有必要吗?对于这个问题,大家不妨先看两个例子:例1:登录密码登录密码一般要求定期改变密码,以防止泄漏,所以密码是有有效期的。例2:安全证书SSL安全证书都有有效期,目的是为了解决吊销的问题。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token都需要设有效期。那么,Token的有效期多长合适呢?一般来说,基于系统安全的需要当然需要尽可能的短,但也不能短得离谱:如果在用户正常操作的过程中,Token过期失效要求重新登录,用户体验岂不是很糟糕?为了解决在操作过程不让用户感到Token失效的问题,有一种方案是在服务器端保存Token状态,用户每次操作都会自动刷新(推迟)Token的过期时间。如此操作会存在一个问题,即在前后端分离、单页App等情况下,每秒可能发起多次请求,如果每次都去刷新过期时间会产生非常大的代价,同样地,如果Token的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率、减少消耗,会把Token的过期时保存在缓存或者内存中。另一种方案是使用RefreshToken,它可以避免频繁的读写操作。这种方案中,服务端无需刷新Token的过期时间,一旦Token过期,就反馈给前端,前端使用RefreshToken申请一个全新Token继续使用。这种方案中,服务端只需要在客户端请求更新Token的时候对RefreshToken的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然RefreshToken也是有有效期的,但是这个有效期就可以长一点了。使用 Token 和 Refresh Token 的时序图如下:1)登录 图:来源于网络2)业务请求 图:来源于网络3)Token 过期,刷新 Token 图:来源于网络参考文献:发布于 2021-01-14 10:19tokenWeb 应用HTTP赞同 917 条评论分享喜欢收藏申请转载文章被以下专栏收录人工智能大数据学
用户身份验证的令牌——Token - 知乎首发于人工智能大数据学习交流切换模式写文章登录/注册用户身份验证的令牌——Token企通查北京奥德塔数据科技有限公司Token是什么?所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。图:来源于网络拿实际过程举例,当你下载QQ或微信后第一次用账号和密码成功登录后,Token就为我们免去了每次打开应用都要输入账号跟密码的过程。为什么要使用Token?为什么要使用Token?这个问题其实很好回答——因为它能解决问题!当下用户对产品的使用体验要求在逐渐提高,从产品体验方面来讲,Token带来的体验更容易能让用户接受。那么Token都可以解决哪些问题呢?Token具有随机性、不可预测性、时效性、无状态、跨域等特点。 Token完全由应用管理,所以它可以避开同源策略Token可以避免CSRF攻击Token可以是无状态的,可以在多个服务间共享Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。当然说到这里大家可能会想到,用服务器的session_id存储到cookies中也能做到,为什么非要用Token呢?网上有许多对比Token和session的文章,在此就不再赘述。其实小编觉得,如果是开发web应用的话,用两者都可以,但如果是开发API接口,前后端分离,最好使用Token,因为session+cookies是基于web的,但针对API接口可能会考虑到移动端,app是没有cookies和session的。Token的生命周期1)用户未登录用户执行注册/登录→一旦基础数据校验成功,后端生成Token,并且Token包含此次注册/登录用户的用户名并通过JsonResponse返回给前端→前端拿到返回的Token后,存入浏览器本地存储2)用户每次访问博客页面从本地存储中拿出Token→JS将Token 放入request的Authorization头,发送http请求向后端索要数据→服务器接到前端请求(当前URL加了loging_check,并且请求方法在methods参数中),进行校验→从requestAuthorization头拿出Token→校验→校验不通过,返回前端异常代码/校验通过,正常执行对应的视图函数→前端一旦接到关于Token的异常码,则删除本地存储中的Token,且将用户转至登录界面。如何设置Token的有效期?其实Token作为一个概念模型,开发者完全可以针对自己开发的应用自定义Token,只要能做到不让不法分子钻系统漏洞即可。那么为Token设置有效期还有必要吗?对于这个问题,大家不妨先看两个例子:例1:登录密码登录密码一般要求定期改变密码,以防止泄漏,所以密码是有有效期的。例2:安全证书SSL安全证书都有有效期,目的是为了解决吊销的问题。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token都需要设有效期。那么,Token的有效期多长合适呢?一般来说,基于系统安全的需要当然需要尽可能的短,但也不能短得离谱:如果在用户正常操作的过程中,Token过期失效要求重新登录,用户体验岂不是很糟糕?为了解决在操作过程不让用户感到Token失效的问题,有一种方案是在服务器端保存Token状态,用户每次操作都会自动刷新(推迟)Token的过期时间。如此操作会存在一个问题,即在前后端分离、单页App等情况下,每秒可能发起多次请求,如果每次都去刷新过期时间会产生非常大的代价,同样地,如果Token的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率、减少消耗,会把Token的过期时保存在缓存或者内存中。另一种方案是使用RefreshToken,它可以避免频繁的读写操作。这种方案中,服务端无需刷新Token的过期时间,一旦Token过期,就反馈给前端,前端使用RefreshToken申请一个全新Token继续使用。这种方案中,服务端只需要在客户端请求更新Token的时候对RefreshToken的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然RefreshToken也是有有效期的,但是这个有效期就可以长一点了。使用 Token 和 Refresh Token 的时序图如下:1)登录 图:来源于网络2)业务请求 图:来源于网络3)Token 过期,刷新 Token 图:来源于网络参考文献:发布于 2021-01-14 10:19tokenWeb 应用HTTP赞同 917 条评论分享喜欢收藏申请转载文章被以下专栏收录人工智能大数据学
用户身份验证的令牌——Token - 知乎首发于人工智能大数据学习交流切换模式写文章登录/注册用户身份验证的令牌——Token企通查北京奥德塔数据科技有限公司Token是什么?所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。图:来源于网络拿实际过程举例,当你下载QQ或微信后第一次用账号和密码成功登录后,Token就为我们免去了每次打开应用都要输入账号跟密码的过程。为什么要使用Token?为什么要使用Token?这个问题其实很好回答——因为它能解决问题!当下用户对产品的使用体验要求在逐渐提高,从产品体验方面来讲,Token带来的体验更容易能让用户接受。那么Token都可以解决哪些问题呢?Token具有随机性、不可预测性、时效性、无状态、跨域等特点。 Token完全由应用管理,所以它可以避开同源策略Token可以避免CSRF攻击Token可以是无状态的,可以在多个服务间共享Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。当然说到这里大家可能会想到,用服务器的session_id存储到cookies中也能做到,为什么非要用Token呢?网上有许多对比Token和session的文章,在此就不再赘述。其实小编觉得,如果是开发web应用的话,用两者都可以,但如果是开发API接口,前后端分离,最好使用Token,因为session+cookies是基于web的,但针对API接口可能会考虑到移动端,app是没有cookies和session的。Token的生命周期1)用户未登录用户执行注册/登录→一旦基础数据校验成功,后端生成Token,并且Token包含此次注册/登录用户的用户名并通过JsonResponse返回给前端→前端拿到返回的Token后,存入浏览器本地存储2)用户每次访问博客页面从本地存储中拿出Token→JS将Token 放入request的Authorization头,发送http请求向后端索要数据→服务器接到前端请求(当前URL加了loging_check,并且请求方法在methods参数中),进行校验→从requestAuthorization头拿出Token→校验→校验不通过,返回前端异常代码/校验通过,正常执行对应的视图函数→前端一旦接到关于Token的异常码,则删除本地存储中的Token,且将用户转至登录界面。如何设置Token的有效期?其实Token作为一个概念模型,开发者完全可以针对自己开发的应用自定义Token,只要能做到不让不法分子钻系统漏洞即可。那么为Token设置有效期还有必要吗?对于这个问题,大家不妨先看两个例子:例1:登录密码登录密码一般要求定期改变密码,以防止泄漏,所以密码是有有效期的。例2:安全证书SSL安全证书都有有效期,目的是为了解决吊销的问题。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token都需要设有效期。那么,Token的有效期多长合适呢?一般来说,基于系统安全的需要当然需要尽可能的短,但也不能短得离谱:如果在用户正常操作的过程中,Token过期失效要求重新登录,用户体验岂不是很糟糕?为了解决在操作过程不让用户感到Token失效的问题,有一种方案是在服务器端保存Token状态,用户每次操作都会自动刷新(推迟)Token的过期时间。如此操作会存在一个问题,即在前后端分离、单页App等情况下,每秒可能发起多次请求,如果每次都去刷新过期时间会产生非常大的代价,同样地,如果Token的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率、减少消耗,会把Token的过期时保存在缓存或者内存中。另一种方案是使用RefreshToken,它可以避免频繁的读写操作。这种方案中,服务端无需刷新Token的过期时间,一旦Token过期,就反馈给前端,前端使用RefreshToken申请一个全新Token继续使用。这种方案中,服务端只需要在客户端请求更新Token的时候对RefreshToken的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然RefreshToken也是有有效期的,但是这个有效期就可以长一点了。使用 Token 和 Refresh Token 的时序图如下:1)登录 图:来源于网络2)业务请求 图:来源于网络3)Token 过期,刷新 Token 图:来源于网络参考文献:发布于 2021-01-14 10:19tokenWeb 应用HTTP赞同 917 条评论分享喜欢收藏申请转载文章被以下专栏收录人工智能大数据学
对于token的认证,如何保证token的及时刷新? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册Web 开发JSON Web Token(JWT)token对于token的认证,如何保证token的及时刷新?1,在拦截器里对将要过期的token 的进行刷新。(一个页面可能n个请求同时发出,也就是说 refresh_token 要支持多个,这个不算最好的解决…显示全部 关注者26被浏览88,408关注问题写回答邀请回答好问题添加评论分享4 个回答默认排序张少林同学 关注前言记录一下前后端分离下————token超时刷新策略!需求场景昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:token失效了,应该怎么做?强制定向到登录页?其实理论上如果是活跃用户,token失效后,假如用户正在操作表单,此时突然定向到登录页面,那用户体验太差了。实现目标延长token过期时间活跃用户在token过期时,在用户无感知的情况下动态刷新token,做到一直在线状态不活跃用户在token过期时,直接定向到登录页登录返回字段如何签发token,请看上一篇推文,这里不做过多介绍。先看看登录接口返回的数据如下: 1@Data
2public class LoginVo implements Serializable {
3
4 private static final long serialVersionUID = 6711396581310450023L;
5
6 //...省略部分业务字段
7
8 /**
9 * token令牌 过期时间默认15day
10 */
11 private String jwt;
12
13 /**
14 * 刷新token 过期时间可以设置为jwt的两倍,甚至更长,用于动态刷新token
15 */
16 private String refreshJwt;
17
18 /**
19 * token过期时间戳
20 */
21 private Long tokenPeriodTime;
22
23}
具体返回字段的意义请看注释,这里再简要说明:jwt:用户正常访问接口时提交的token,过期时间设置长一些,15day吧refreshJwt:刷新token 过期时间可以设置为jwt的两倍,甚至更长,用于动态刷新token时候提交后台验证tokenPeriodTime:token过期时间戳,前端每次调用接口前需要主动判断是否已经过期,如果过期则提交refreshJwt访问token刷新的接口进行刷新动态刷新token前端检测到token过期后,携带refreshJwt访问后台刷新token的接口,服务端在拦截器中依然对refreshJwt进行解析鉴权假如refreshJwt也过期了,提示登录过期,强制跳转登录页假如refreshJwt还在有效期,则签发新的token返回,前端使用最新的token进行接口请求总结如果是活跃用户,那么允许他在refreshJwt过期时间与token过期时间的差值这段时间内,不停的动态刷新token,使其做到无感知的状态下一直保持登录状态如果用户不活跃,在refreshJwt过期时间到了,依然没有使用系统,那么将判定为不活跃用户,此时应当重定向到登录页了最后篇幅较短,主要是延续上一篇 前后端分离应用——用户信息传递 遗留问题做一下总结。如果你有更好的做法,欢迎留言告知我,谢谢啦。后续会不定期更新原创文章,欢迎关注公众号 「张少林同学」!编辑于 2019-01-22 12:22赞同 167 条评论分享收藏喜欢收起编程乐趣 关注这是我之前分享在星球里面的课程,下面整理下,分享下这个无感刷新Token技术方案。我们都知道Token是有设置有效期的,为了安全都不会设置过长的有效期;但设置有效期太短,又会导致经常需要重新登录。这就需要无感刷新Token的方案,来提升用户体验。目前比较常用的方案是:双token机制。1、登录时同时返回:Token、RefreshToken,Token用于请求业务接口,RefreshToken用于刷新Token接口;2、每一次Http请求,客户端都会判断服务器返回状态,如果是401,代表Token过期;3、客户端使用RefreshToken,请求服务器Token刷新接口,并获取新的:Token,RefreshToken;4、如果第3步骤成功返回,更新本地的Token、RefreshToken;如果返回失败,代表RefreshToken也过期了,提示过期并跳转至登录页面。下面我们一起看下实现步骤:1、后台登录接口登录验证,验证用户名和密码,验证通过返回Token。登录接口返回的2个内容:Token和RefreshToken,这两个有效期不一样,比如Token有效期是30分钟,RefreshToken有效期是60分钟。2、后台刷新token接口和登录接口一样,也是返回:Token和RefreshToken。3、前端登录功能在前端登录页面,成功登录后,把Token和RefreshToken存储在本地,可以存储在Cookie或者LocalStorage。4、错误响应拦截器axios响应拦截器添加如下代码:a、判断Http返回状态是否为401。b、判断是否授权信息是否使用refreshToken,调用刷新token接口,同样也会发起Http请求,如果refreshToken也过期了,同样会返回401;所以这边要加判断,避免进入死循环。c、如果refreshToken也过期了,直接跳转至登录页面。d、如果调用刷新token接口成功返回,更新本地存储的Token、RefreshToken;并获取上一次业务请求的内容,并更新验证信息,重新发起上一次业务请求,这样才能实现无感刷新。5、实现效果最终实现效果如下:1、请求用户列表接口,返回401;2、调用token刷新接口;3、重新请求用户列表接口。在这过程中,第一次发起用户搜索请求是失败的,我们马上刷新token,并重新发起第二次用户搜索请求,但对用户来说是透明、毫无察觉的。好了,今天就分享到这了。顺便分享一个资料:最后,如果对你有帮助,欢迎点赞、收藏!- End -发布于 2024-02-02 23:28赞同 11 条评论分享收藏喜欢收起
用户身份验证的令牌——Token - 知乎首发于人工智能大数据学习交流切换模式写文章登录/注册用户身份验证的令牌——Token企通查北京奥德塔数据科技有限公司Token是什么?所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。图:来源于网络拿实际过程举例,当你下载QQ或微信后第一次用账号和密码成功登录后,Token就为我们免去了每次打开应用都要输入账号跟密码的过程。为什么要使用Token?为什么要使用Token?这个问题其实很好回答——因为它能解决问题!当下用户对产品的使用体验要求在逐渐提高,从产品体验方面来讲,Token带来的体验更容易能让用户接受。那么Token都可以解决哪些问题呢?Token具有随机性、不可预测性、时效性、无状态、跨域等特点。 Token完全由应用管理,所以它可以避开同源策略Token可以避免CSRF攻击Token可以是无状态的,可以在多个服务间共享Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。当然说到这里大家可能会想到,用服务器的session_id存储到cookies中也能做到,为什么非要用Token呢?网上有许多对比Token和session的文章,在此就不再赘述。其实小编觉得,如果是开发web应用的话,用两者都可以,但如果是开发API接口,前后端分离,最好使用Token,因为session+cookies是基于web的,但针对API接口可能会考虑到移动端,app是没有cookies和session的。Token的生命周期1)用户未登录用户执行注册/登录→一旦基础数据校验成功,后端生成Token,并且Token包含此次注册/登录用户的用户名并通过JsonResponse返回给前端→前端拿到返回的Token后,存入浏览器本地存储2)用户每次访问博客页面从本地存储中拿出Token→JS将Token 放入request的Authorization头,发送http请求向后端索要数据→服务器接到前端请求(当前URL加了loging_check,并且请求方法在methods参数中),进行校验→从requestAuthorization头拿出Token→校验→校验不通过,返回前端异常代码/校验通过,正常执行对应的视图函数→前端一旦接到关于Token的异常码,则删除本地存储中的Token,且将用户转至登录界面。如何设置Token的有效期?其实Token作为一个概念模型,开发者完全可以针对自己开发的应用自定义Token,只要能做到不让不法分子钻系统漏洞即可。那么为Token设置有效期还有必要吗?对于这个问题,大家不妨先看两个例子:例1:登录密码登录密码一般要求定期改变密码,以防止泄漏,所以密码是有有效期的。例2:安全证书SSL安全证书都有有效期,目的是为了解决吊销的问题。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token都需要设有效期。那么,Token的有效期多长合适呢?一般来说,基于系统安全的需要当然需要尽可能的短,但也不能短得离谱:如果在用户正常操作的过程中,Token过期失效要求重新登录,用户体验岂不是很糟糕?为了解决在操作过程不让用户感到Token失效的问题,有一种方案是在服务器端保存Token状态,用户每次操作都会自动刷新(推迟)Token的过期时间。如此操作会存在一个问题,即在前后端分离、单页App等情况下,每秒可能发起多次请求,如果每次都去刷新过期时间会产生非常大的代价,同样地,如果Token的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率、减少消耗,会把Token的过期时保存在缓存或者内存中。另一种方案是使用RefreshToken,它可以避免频繁的读写操作。这种方案中,服务端无需刷新Token的过期时间,一旦Token过期,就反馈给前端,前端使用RefreshToken申请一个全新Token继续使用。这种方案中,服务端只需要在客户端请求更新Token的时候对RefreshToken的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然RefreshToken也是有有效期的,但是这个有效期就可以长一点了。使用 Token 和 Refresh Token 的时序图如下:1)登录 图:来源于网络2)业务请求 图:来源于网络3)Token 过期,刷新 Token 图:来源于网络参考文献:发布于 2021-01-14 10:19tokenWeb 应用HTTP赞同 917 条评论分享喜欢收藏申请转载文章被以下专栏收录人工智能大数据学
前端登录退出:处理Token问题(获取、缓存、失效处理)以及代码实现_退出登录token-CSDN博客
前端登录退出:处理Token问题(获取、缓存、失效处理)以及代码实现
离奇6厘米
已于 2022-11-05 11:08:23 修改
阅读量9.9k
收藏
40
点赞数
6
分类专栏:
vue+组件库
文章标签:
javascript
vue.js
前端
于 2022-11-05 11:01:19 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Vest_er/article/details/127696264
版权
vue+组件库
专栏收录该内容
7 篇文章
2 订阅
订阅专栏
目录
一、什么是Token二、获取token三、Token失效处理注意点1、主动退出2、Token过期① 逻辑图②方案③代码实现
3、被人顶号① 逻辑图② 方案③代码实现
一、什么是Token
Token是服务端生成的一串字符串,当用户第一次登陆成功后,服务器会生成一个token,并将其返回给客户端。 当用户再次向服务器请求数据时,只需要携带着token请求数据即可,无需再次登陆用户名和密码 目的 通过token做一层数据拦截,可以减少数据库请求次数,减缓服务器压力
二、获取token
当用户第一次登陆成功之后,后台会返回一个token给到客户端,前端将token缓存到本地,然后每次发请求时需要在 header 里边带上 token,这个时候本地的 token 和后台数据库中的 token 进行一个验证,如果两者一致,则请求成功,否则失败。
三、Token失效处理
既然前后端通过token交互,如果一直有效,会有安全风险,所以我们需要在客户端进行一下token的时间检查 服务器的token一般不会设置太长,根据实际一般是1-7天,没有一个token是永久的,永久的token就相当于一串永久的密钥,是不安全的。
token失效一般用两种情形: ① 主动退出:用户点击退出登录按钮后退出 ② 被动退出:token过期,或被人“顶号”退出
注意点
无论什么方式退出token,在用户退出时,所需要执行的操作都是固定的 1、清理掉当前用户的缓存数据 2、清理掉相关权限的配置 3、返回到登录页面
1、主动退出
用户主动点击退出功能实现 user.js
// 获取退出登录
logout(context) {
context.commit("removeToken"); // 删除token
context.commit("reomveUserInfo"); // 删除用户信息
},
2、Token过期
① 逻辑图
②方案
在用户登录时,记录当前的登录时间 制定一个token时效时长 在接口调用时,根据当前时间对比登录时间,看是否超过了时效时间 如果未超过,则正常进行后续操作,如果超过,则进行退出登录操作
③代码实现
user.js
// 获取登录信息
async login(context, data) {
const result = await loginInfo(data);
context.commit("setToken", result);
setTimeStamp(); // 写入时间戳
},
auth.js
import Cookies from "js-cookie";
const timeKey = 'liqi6limi-timestamp-key' // 设置一个独一无二的key
// 获取时间戳
export function getTimeStamp() {
return Cookies.get(timeKey)
}
// 设置时间戳
export function setTimeStamp() {
Cookies.set(timeKey, Date.now())
}
// 设置超时时间
export const TimeOut = 3600;
// 是否超时
export function IsCheckTimeOut() {
var currentTime = Date.now(); // 当前时间戳
var timeStamp = getTimeStamp(); // 缓存时间戳
return (currentTime - timeStamp) / 1000 > TimeOut;
}
request.js
import store from "@/store";
import axios from "axios";
import { getTimeStamp,IsCheckTimeOut } from "@/utils/auth";
import router from "@/router";
// 创建axios实例
const service = axios.create({
baseURL: "/api",
timeout: 5000,
});
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 是否存在token
if (store.getters.token) {
if (IsCheckTimeOut()) {
store.dispatch("user/logout"); // 退出登录的action
router.push("/login"); // 跳转到登录页
return Promise.reject(new Error("token超时了")); // 抛出的错误,会在响应拦截器的错误捕捉中捕捉到
console.log("超时");
}
config.headers["Authorization"] = `Bearer ${store.getters.token}`; // 如果token存在 注入token
}
return config; // 必须返回配置
},
(error) => {
return Promise.reject(error);
}
);
3、被人顶号
① 逻辑图
② 方案
后端返回数据时,会返回特定的状态码通知前端 当前端接收到特定状态码时,表示遇到了特定状态:此时进行退出登录处理
③代码实现
// 响应拦截器
service.interceptors.response.use(
(response) => {
// axios默认加了一层data
const { success, message, data } = response.data;
// 要根据success的成功与否决定下面的操作
if (success) {
return data;
} else {
// 业务已经错误了
Message.error(message); // 提示错误消息
return Promise.reject(new Error(message));
}
},
(error) => {
// error 信息 里面 response的对象
if (
error.response &&
error.response.data &&
error.response.data.code === 10002
) {
// 当等于10002的时候 表示 后端告诉我token超时了
store.dispatch("user/logout"); // 登出action 删除token
router.push("/login");
} else {
Message.error(error.message); // 提示错误信息
}
return Promise.reject(error);
}
);
优惠劵
离奇6厘米
关注
关注
6
点赞
踩
40
收藏
觉得还不错?
一键收藏
知道了
0
评论
前端登录退出:处理Token问题(获取、缓存、失效处理)以及代码实现
前端登录退出:处理Token问题(获取、缓存、失效处理)以及代码实现
复制链接
扫一扫
专栏目录
参与评论
您还未登录,请先
登录
后发表或查看评论
退出登录 清除token
weixin_57711933的博客
04-03
728
stor/module/user.js 文件。
WEB安全(十一)退出登录场景下如何使token失效
jinyangjie的博客
02-16
5698
使用token做认证授权时,会发现注销登录等场景下token还有效。因为token不同于Session认证方式——用户退出登录时,服务端删除对应的Session记录即可。如果不引入其他机制,则退出登录时,token仍有效,即仍是登录状态,直到token有效时间到。
下面介绍几个方案:
1、直接从客户端移除token
显然,这对服务端的安全性没有任何帮助,但是这的确使客户端退出登录,而且通过删除token来阻止攻击者,因为他们必须在注销之前窃取token。
2、创建token黑名单
可以维护一份token黑名
实战5 用户登录与退出
最新发布
shieryue_2016的博客
12-19
492
(3)layout/components/Navbar.vue组件,进行如下修改。(1)修改vue.config.js 文件中mock请求注释掉,并设置代理。(5)修改env.development/env.production。(3)修改src/utils目录下的request.js脚本文件。在util/myconfirm.js文件,代码如下。(1)api/user.js 编写退出接口代码。(4)修改api/user.js 文件代码。(6) 修改store/user.js。(2)修改main.js。
登录、退出(关于token)
Jason_996的博客
11-06
9889
比较标准的方案是“带时效检测的token机制”。所谓token,即“令牌”的意思。那这个token机制的执行逻辑是怎么样的呢?
当用户刚安装完APP,并进行了注册,拥有了账号和密码后。此时,则该进行首次登录了(所以在登录时最好加个是否首次登录的参数传给后台)
APP将用户输入的 账号和密码 提交给服务器;
服务器对其进行校验,若账号和密码对得上则校验通过,说明登录成功,并生成一个tok...
技术汇总:第十六章:关于登录与退出的token
weixin_44519496的博客
10-01
431
当两个设备都操作登录时,后操作的设备将具备登录权限,而之前登录的设备失去登录权限。
通常的登录业务,按照 token 随机生成的话,不同设备拥有不同的 token ,根据 token 来作为 key 保存登录数据,是可以同时登录同一个帐号,并且都保持在线的。因为这些 token 里面如果存登录状态的话,都会是已登录模式。
既然有这个唯一设备登录的需求,那就单独设置一个 user_login 的规则好了,比如 @caola 提供的方案, token 记录会话数据, userid 记录最后登录的 token ,
基于token的一个登录与退出组件
m0_56026872的博客
08-26
918
笔记
1. 登录业务的相关技术点
http是无状态的
通过cookie在客户端记录状态
通过session在服务器端记录状态
通过token方式维持状态
注意:
如果我们的前端和后台接口之间不存在跨域问题,我们一般使用 cookie 和 session 来记录登录状态
如果存在跨域问题,我们一般就使用 token 来维持登录状态
2. token 原理分析
token是保证用户登录成功之后的唯一身份令牌
登录页面输入用户名和密码进行登录
服务器验证通过之后生成该用户的 token
Token的使用
m0_50846834的博客
11-11
4008
springboot+vue实现前后端分离中token的使用
Vue 获取token(设置token,清除token)实现登录
贩梦的博客
04-12
2040
cookie :可设置失效时间,否则默认为关闭浏览器后消失
localStorage :除非被手动清除,否则永久保存
sessionStorage:仅在当前网页会话下有效,关闭页面或浏览器后就会被清除
vue实际运用:处理token过期
qq_45225759的博客
06-20
2152
处理token过期
前端项目-10-注册-登录-退出登录-导航守卫
ycmy2017的博客
04-11
687
注册-登录-退出登录-导航守卫
Java令牌Token登录与退出的实现
08-19
主要介绍了Java令牌Token登录与退出的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Jmeter接口登录获取参数token报错问题解决方案
08-18
主要介绍了Jmeter接口登录获取参数token报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
10-21
主要介绍了JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法,结合实例形式分析了javascript提示此类异常的常见原因与相关解决方法,需要的朋友可以参考下
Module parse failed: Unexpected token
01-20
Module parse failed: Unexpected token 问题描述 学习React出现的一个问题 从官网拿到的一个例子 class HelloMessage extends React.Component { render() { return ( Hello {this.props.name} ); } } ...
vue的token刷新处理的方法
10-18
主要介绍了vue的token刷新处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
vue实现用户长时间不操作自动退出登录功能的实现代码
11-20
使用 mouseover 事件来监测是否有用户操作页面,写一个定时器间隔特定时间检测是否长时间未操作页面,如果是,退出登陆,清除token,返回登录页 三、实现 【1】在util文件夹下创建一个storage.js封装localStorage...
Vue项目报错:Uncaught SyntaxError: Unexpected token
01-19
遇到问题: 今天做一个 VUE 的项目,在引入第三方依赖的 JS 文件时,遇到了一个问题: 控制台的提示:Uncaught SyntaxError: Unexpected token < 按照提示进入文件,再看如下图: 仔细看了看 index.html 文件,...
【JavaScript源代码】VUE Token的失效处理详解.docx
12-29
后端:收到用户访问某个接口时,检查当前token是否失效,如果token已经失效,返给前端一个约定好的状态码 10002 前端:在响应拦截器中,分析接口的返回值,如果状态码为10002, 则进行token失效操作 代码落地
Android token失效自动退出登录和token添加
07-27
对于 Android 应用中的 token 失效问题,通常可以通过以下两种方式来处理:自动退出登录和 token 刷新。
1. 自动退出登录:
当用户的 token 失效时,可以在请求后端接口时检测到返回的错误码或错误信息,比如 401 Unauthorized。在这种情况下,你可以选择自动退出登录,并要求用户重新登录以获取新的有效 token。具体的实现方式可以根据你的应用架构和需求进行调整,例如清除本地保存的 token、清除用户登录状态等。
2. Token 刷新:
另一种处理方式是在 token 失效前提前刷新 token。这可以避免用户在使用应用时遇到频繁的退出登录和重新登录操作。要实现 token 刷新,你可以在每次请求后端接口时检测到 token 失效时,发送一个特殊的刷新 token 请求给后端。后端会验证旧的 token,并返回新的有效 token 给客户端。客户端接收到新的 token 后,可以更新本地保存的 token,并使用新的 token 继续发送请求。
需要注意的是,为了保护用户的安全和隐私,token 刷新接口应该是受保护的,并且需要进行一定的安全性验证,以防止恶意请求。
在实际开发中,你可以根据你的应用需求和后端接口设计来选择适合的方式来处理 token 失效问题。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
离奇6厘米
CSDN认证博客专家
CSDN认证企业博客
码龄6年
暂无认证
135
原创
4万+
周排名
142万+
总排名
33万+
访问
等级
1697
积分
113
粉丝
263
获赞
50
评论
864
收藏
私信
关注
热门文章
Vue路由导航报错:NavigationDuplicated: Avoided redundant navigation to current location解决方法
51490
git报错:Reinitialized existing Git repository in ...解决方法
26960
npm报错:A complete log of this run can be fund in:解决方案
23895
解决vue使用$refs:报错this.$refs.xxx.xxx() is not a function
14688
Vue脚手架报错:‘v-model‘ directives require no argument 解决方案
10020
分类专栏
工具分享
7篇
JavaScript
26篇
小程序
11篇
css
3篇
ajax
12篇
服务器
2篇
vue+组件库
7篇
报错专栏
7篇
vue
37篇
node.js
4篇
git和github
1篇
jQuery
2篇
npm
1篇
express
2篇
mysql
1篇
最新评论
解决:Vue调试工具vue-devtools安装方法——解决下载速度缓慢,安装报错问题
a 青春年华:
大佬可以在分享下吗? 最新版的用起来比较的卡
npm报错:A complete log of this run can be fund in:解决方案
m0_69564022:
发的文件都不知道要打包一下吗?
Vue路由导航报错:NavigationDuplicated: Avoided redundant navigation to current location解决方法
Yazk.:
有用,支持
Vue路由导航报错:NavigationDuplicated: Avoided redundant navigation to current location解决方法
LewisRoc:
讲得这么详细,冲名字赞一个
如何查询网站服务器类型
鱼可欣:
谢谢 查到了
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
JS学习第11天——函数进阶(this指向、严格模式、高阶函数、闭包、递归)
JS学习第10天——ES5中面向对象(原型和原型链、forEach、map、filter、some、every、trim、Object.keys、Object.defineProperty方法的使用)
JS学习第9天——ES6中面向对象(类class、constructor构造函数、类的继承extends、super关键字、面向对象tab栏切换案例)
2023年25篇
2022年103篇
2021年7篇
目录
目录
分类专栏
工具分享
7篇
JavaScript
26篇
小程序
11篇
css
3篇
ajax
12篇
服务器
2篇
vue+组件库
7篇
报错专栏
7篇
vue
37篇
node.js
4篇
git和github
1篇
jQuery
2篇
npm
1篇
express
2篇
mysql
1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
token的原理及过期处理_token过期时间-CSDN博客
token的原理及过期处理
最新推荐文章于 2024-03-11 08:27:42 发布
前端扫地僧
最新推荐文章于 2024-03-11 08:27:42 发布
阅读量1.7w
收藏
32
点赞数
7
文章标签:
vue.js
vuex
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45839045/article/details/124260156
版权
Token 是用户登录成功之后服务端返回的一个身份令牌,在项目中的多个业务中需要使用到:
访问需要授权的 API 接口校验页面的访问权限…
但是我们只有在第一次用户登录成功之后才能拿到 Token。
所以为了能在其它模块中获取到 Token 数据,我们需要把它存储到一个公共的位置,方便随时取用。
往哪儿存?
本地存储
获取麻烦数据不是响应式 Vuex 容器(推荐)
获取方便响应式的 登录成功,将 Token 存储到 Vuex 容器中
获取方便响应式 为了持久化,还需要把 Token 放到本地存储
持久化
关于 Token 过期问题
登录成功之后后端会返回两个 Token:
token:访问令牌,有效期2小时refresh_token:刷新令牌,有效期14天,用于访问令牌过期之后重新获取新的访问令牌
我们的项目接口中设定的 Token 有效期是 2 小时,超过有效期服务端会返回 401 表示 Token 无效或过期了。
为什么过期时间这么短?
为了安全,例如 Token 被别人盗用
过期了怎么办?
让用户重新登录,用户体验太差了使用 refresh_token 解决 token 过期
服务器生成token的过程中,会有两个时间,一个是token失效时间,一个是token刷新时间,刷新时间肯定比失效时间长,当用户的 token 过期时,你可以拿着过期的token去换取新的token,来保持用户的登陆状态,当然你这个过期token的过期时间必须在刷新时间之内,如果超出了刷新时间,那么返回的依旧是 401。
处理流程:
在axios的拦截器中加入token刷新逻辑当用户token过期时,去向服务器请求新的 token把旧的token替换为新的token然后继续用户当前的请求
优惠劵
前端扫地僧
关注
关注
7
点赞
踩
32
收藏
觉得还不错?
一键收藏
知道了
1
评论
token的原理及过期处理
Token 是用户登录成功之后服务端返回的一个身份令牌,在项目中的多个业务中需要使用到:访问需要授权的 API 接口校验页面的访问权限…但是我们只有在第一次用户登录成功之后才能拿到 Token。所以为了能在其它模块中获取到 Token 数据,我们需要把它存储到一个公共的位置,方便随时取用。往哪儿存?本地存储获取麻烦数据不是响应式Vuex 容器(推荐)获取方便响应式的登录成功,将 Token 存储到 Vuex 容器中获取方便响应式为了持久化,还需
复制链接
扫一扫
1 条评论
您还未登录,请先
登录
后发表或查看评论
access_token验证过期类
11-29
access_token验证过期类,验证过期的处理办法,超过一小时则从新获取。
token的处理及无感知刷新---个人理解向
m0_55918015的博客
05-18
3149
token是我们在登录系统后,后端会给我们返回的一个字段,我们需要在每次发送请求的时候,将token注入请求头,这样后端才能够给我们返回我们需要的信息。出于安全考虑,token的有效期一般是1-8小时,一般是2小时,那设想这样两个场景:
1.如果用户一天都在我们系统上打工,忙了九个小时,结果token过期了,没办法发送请求了,只能退出重新登录,重新获取新的token,肯定会影响用户体验的。我们需要token过期了,但是通过某种手段,让用户能够继续正常使用我们的系统,用户感觉不到。
2.用户如果一段时间,
解决 微信公众号token一直莫名其妙出现token过期问题
孤er尽悲欢绝的博客
01-12
495
解决 微信公众号token一直莫名其妙出现token过期问题
java jwt刷新_jwt刷新token
weixin_32562455的博客
02-27
2870
前一段时间讲过了springboot+jwt的整合,但是因为一些原因(个人比较懒)并没有更新关于token的刷新问题,今天跟别人闲聊,聊到了关于业务中token的刷新方式,所以在这里我把我知道的一些点记录一下,也希望能帮到一些有需要的朋友,同时也希望给我一些建议,话不多说,上代码!1:这种方式为在线刷新,比方说设定的token有效期为30min,那么每次访问资源时,都会在拦截器中去判断一下toke...
前端刷新token,判断token是否过期,若没有过期则刷新token,过期则退出登录
baidu_39009276的博客
12-08
7385
前端刷新token,判断token是否过期,若没有过期则刷新token,过期则退出登录
token响应式设置
adlixiaxia的博客
12-02
611
处理用户 Token
Token 是用户登录成功之后服务端返回的一个身份令牌,在项目中的多个业务中需要使用到:
访问需要授权的 API 接口
校验页面的访问权限
…
但是我们只有在第一次用户登录成功之后才能拿到 Token。
所以为了能在其它模块中获取到 Token 数据,我们需要把它存储到一个公共的位置,方便随时取用。
往哪儿存?
本地存储
获取麻烦
数据不是响应式
Vuex 容器(推荐)
获取方便
响应式的
登录成功,将 Token 存储到 Vuex 容器中
获取方便
响应式
token过期机制的问题
qq_46940224的博客
10-15
3733
浅谈一下token过期机制的问题
如何对登录token有效期控制,前端控制和后端控制
LOxia的博客
08-04
4845
如何对登录token有效期控制,前端控制和后端控制
Java编程——Token 认证的来龙去脉
weixin_33672109的博客
07-19
248
通常情况下,我们在讨论某个技术的时候,都是从问题开始。那么第一个问题:
为什么要用 Token?
而要回答这个问题很简单——因为它能解决问题!
可以解决哪些问题呢?
1. Token 完全由应用管理,所以它可以避开同源策略
2. Token 可以避免CSRF 攻击
3....
Token实现登录、token过期解决以及数据解析
qq_38935605的博客
10-21
7226
token我们可以理解为一个令牌,主要的作用是守护我们系统的安全,像我们登录这些都是可以使用token进行用户数据校验的,那么为什么不用传统的session呢?可能很多人直接使用上面的代码进行登录接口实现了,那么同志们有想过一个问题吗?上面设置了token的过期时间的,当用户正在使用我们软件的时候,突然token过期了直接报了个401,这个时候用户肯定是一脸懵逼了,有很多软件都会出现这个问题,就是因为偷懒了,我们不经常发现是因为他们的token设置的过期时间较长而已。--导入下面依赖吧-->
微信公众平台开发-如何保证access_token长期有效
05-06
博客教程《微信公众平台开发教程第22篇-如何保证access_token长期有效》的配套代码,教程地址如下:
http://blog.csdn.net/lyq8479/article/details/25076223
Android token过期刷新处理的方法示例
08-26
主要介绍了Android token过期刷新处理的方法示例,本文详细的介绍了2种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
PHP token验证生成原理实例分析
10-16
主要介绍了PHP token验证生成原理,结合实例形式分析了php的token验证原理与使用技巧,需要的朋友可以参考下
Vue 拦截器对token过期处理方法
08-28
下面小编就为大家分享一篇Vue 拦截器对token过期处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
vue的token刷新处理的方法
10-18
主要介绍了vue的token刷新处理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
react vue 背景挂载机器
qq_45623378的博客
03-08
656
问题:项目当中我们有的时候会遇到多个背景图片在一个地方展示的问题当时项目比较急没有时间做工具函数,被优化有时间进行工具函数编写。
探索Vue.js:前端开发的新视角
最新发布
2301_76901566的博客
03-11
1123
Vue.js是一款由尤雨溪创建的开源JavaScript框架,首次发布于2014年。它的设计灵感来自于Angular和React等流行的前端框架,但与这些框架相比,Vue.js更加轻量级、易于学习和使用。Vue.js采用了MVVM(Model-View-ViewModel)架构模式,通过数据驱动和组件化的思想来构建用户界面。
token + redis 过期更新
09-06
在Redis中,使用token来管理过期时间是一种常见的做法。当客户端请求服务时,服务器会生成一个唯一的token,并将其存储在Redis中作为key,同时存储一些与token相关的信息,如用户ID、过期时间等作为value。通过设置过期时间,可以有效地控制token的生命周期并提升系统的安全性和性能。
当一个token过期时,服务器会检查其是否存在于Redis中。如果存在,则说明该token还在有效期内,服务器可以继续验证请求,并更新token的过期时间,延长其有效期。这样做的好处是避免了频繁地向数据库查询token信息,降低了系统的负载压力和响应时间。
在进行过期更新时,可以使用Redis提供的expire命令来设置新的过期时间。通过expire命令,我们可以指定一个新的过期时间(以秒为单位),当时间达到时,Redis会自动将该key删除。同时,我们还可以使用set命令更新token的value,以便存储一些新的信息或者刷新其过期时间。
另外,为了保证系统的性能和避免出现脏数据,可以采取定期清理过期token的策略。通过定期的清理工作,我们可以及时地清除过期的token,释放相关的存储空间,提高系统的可用性和性能。
综上所述,通过使用token来管理过期时间,并在过期时及时地更新它们,可以有效地提升系统的安全性和性能。而Redis提供的expire和set命令可以方便地实现过期更新的功能。定期清理过期token则是保证系统健康运行的重要步骤。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
前端扫地僧
CSDN认证博客专家
CSDN认证企业博客
码龄4年
暂无认证
72
原创
40万+
周排名
163万+
总排名
7万+
访问
等级
756
积分
18
粉丝
31
获赞
5
评论
122
收藏
私信
关注
热门文章
token的原理及过期处理
17235
cookie、session、token的区别
6059
ajax提交数据中formdata的使用
5404
JavaScript中for 循环和foreach的区别
3424
token的理解与使用
3387
最新评论
token的原理及过期处理
renjunqing:
真是奇葩的逻辑,用一个过期的token换取正常token,还要有效期干什么?
前端学习之 ajax中实现post上传文件并展示进度条组件
CodingZn:
全是废话,上传文件一点干货没有
前端学习之JavaScript 三大系列的区别和用法
猿猿子:
写得马马虎虎,不错不错,建议贵公司录取(doge
前端学习之JavaScript 三大系列的区别和用法
m0_69073925:
写得很好,孩子学了马上就能编页面了
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
图片懒加载的原理
cookie、session、token的区别
vue2和vue3的区别
2022年58篇
2021年14篇
目录
目录
最新文章
图片懒加载的原理
cookie、session、token的区别
vue2和vue3的区别
2022年58篇
2021年14篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
用户在使用过程中token失效怎么处理? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册OAuth用户分析用户行为数据JSON Web Token(JWT)token用户在使用过程中token失效怎么处理?比如用户正在打团,token失效,是否是返回登陆界面显示全部 关注者6被浏览33,083关注问题写回答邀请回答好问题添加评论分享4 个回答默认排序铛铛任务生财有道 关注在请求返回结果中拦截 如果发现返回的是token 失效, 使用同步请求获取新的token 再使用新的token重新请求,这样就不用重新跳转到登陆中发布于 2020-11-22 09:25赞同 4添加评论分享收藏喜欢收起web3团子一起把握住市场的红利 关注近日,以太坊联合创始人 Vitalik 就治理 Token 发表了自己的看法并与 twitter 网友展开了讨论。他认为治理权作为 Token 价值的体现是病态的,在讨论中甚至直言治理 Token 只不过是一种“memecoin”。当前市场上存在着一些具有高利润的项目如 UNI、ENS 等,但鉴于监管等原因不将利润分配给持有者,许多团队不愿意触碰法律边界,便采取了治理 Token 形式存在。在加密货币领域,许多带有治理功能的 Token 大多数仍会出现集权的现象。首先可以体现在团队的集权,如 Compound COMP 将大约 46% 分发给股东、创始人和 Compound 团队,团队持有 Token 权重过大造成了用户特别是散户投票的无关紧要。虽然许多项目团队通过流动性挖矿等激励手段,奖励用户一定的治理 Token 以间接地将治理权下放,但不可否认许多 Token 仍集中在团队手中。其次,正如 Vitalik 所说,“支付 500 美元以获得 0.0001% 的机会来影响某些投票的结果并不是一个好的交易。唯一认为这是一笔好交易的人是千万富翁和对冲基金”。“鲸鱼”也是治理 Token 集权的主体之一,拥有巨额财富的他们拥有足够的购买力获取话语权,更多的资本意味着更多的权力,在参与事务决策时候更有决定能力。同时,我们也看到“Binance 成为 Uniswap 最大委托地址”这样的新闻,CEX 挪用用户具有治理权的 Token 去参与去中心项目投票,影响决策结果的可能性。由于中心化交易所的巨大用户市场份额,加上 FTX 的前车之鉴,CEX 作恶参与去中心化项目治理的风险未尝不可能。治理 Token 集权的途径多种多样,而作为 Token 唯一的功能,普通用户都难以掌握话语权,不仅违背了去中心化精神也让小额持有者缺乏动力参与治理。人们在购买治理 Token 时候,产生社会渴望——希望成为有意义、令人愉快的事务决策的一员,并能够对此产生影响。投票的问题在于找到一种方法来倾听整个社区的声音,而不仅仅是 Token 富有者,当大多数 Token 集中在少数人手中时,普通人对此没有动力或者没有能力去行使发言权。治理 Token 作为“能够买到的选票”,使项目投票治理更容易被贿赂攻击。在资本泛滥的加密货币市场显得很简单,比较典型的例子是 Curve “行贿”事件,因为 Curve 平台每个矿池的流动性激励,将会由其 veCRV 投票权决定,而 veCRV 的多少取决于持有者手里的 CRV 的数量,越多 veCRV 持有者为其投票,它的流动性激励就会越高。为提高自己的 APY,不同矿池通过购买“贿赂”别人来帮自己投票,使用 CRV 的投票权,也造成了著名的治理权之争 Curve war。贿赂攻击在合理的机制下会对项目本身有帮助,但需要认识到贿赂攻击或者像 Curve war 贿赂竞争只是手握大量权限精英的获利行为,对于本来已经影响甚微的小额持有者只是进一步紧缩。此外,治理 Token 的价值捕获一直为人诟病,其价格部分来自用户对未来有一天可能能够将它们变成证券的预期,但在现有法律法规条件下,维持原状在长期来看概率更大。在功能单一条件下,其还存在未来稀释治理权的可能性;从实用性说,在治理 Token 和有实际赋能的 Token 选择中,投资者更应参与一个愿意给他们实际价值的 web3 项目的治理。需要明确的是,Vitalik 不反对 Token 的治理功能,而是指责治理 Token 的功能单一,认为 Token 的治理权不能作为其主要的估值叙述。早在 2021 年,他就发表《Token 投票不应是治理权力下放的唯一合法形式》表达过自己的看法,他认为去中心化治理是必要的,肯定了去中心化治理为协议维护和升级、为公共产品提供资金等仍然做出重要贡献。Token 的治理权集中一定程度上说是项目 Token 设计对人性博弈的失败。有限治理或成为解决方向之一,例如实行将投票决策事项减少、设置治理权限参数选择上限、添加时间延迟(T+X 模式)措施,有限治理垄断行为止于繁琐的流程、权限的稀缺。而治理 Token 的投机行为也是困境之一,表面上看,治理是持有者购买的动机,实际上持有者只是投机获取利润价差,大多数治理 Token 持有者对参与事务决策的冷漠,看不到自己治理权利的价值,治理参与度低,导致一定的治理权的浪费。针对只有 Token 持有者能参与治理的问题,Vitalik 提出了非 Token 驱动的治理方案,一是可以通过以 Proof Of Humanity 和 Bright ID 为代表的人格证明系统即验证帐户是对应于唯一个人的系统,确认该用户是真人,分配该用户一票治理权;二是使用参与证明系统,让系统证明某个帐户对应于参加过某个活动、通过了一些教育培训或在生态系统中进行了一些有用工作的人,其中以 POAP 为代表,从而增加真正为社区行动用户回报的治理权。非 Token 形式决定治理权限一方面亦可以限制纯 Token 形式决定参与权的垄断,另一方面也鼓励社区参与者真正地为项目工作,而非只是购买 Token 进行投机。非 Token 驱动的治理在机制上避免了过分利益化,Vitalik 认为这非 Token 驱动的治理实行某种形式的反勾结,确保非货币资源的投票权仍然是非金融资源,而不是将其治理权出售给出价最高的人。另外,为解决贿选问题,一些 DAO 尝试使用时间锁定技术(timelock techniques),要求用户锁定其 Token,并在一段时间内不能转移 Token 用以投票。该技术可以在短期内限制贿选,时间锁定机制就像电子报刊网站上的一道付费墙,使贿选的门槛提高。还有一些社区尝试直接拒绝交易所投票权,因为 CEX 会实行 Token 利益共享权和治理权分离开来的中心化机制,让权利分拆。而用户将他们的 Token 存入中心化交易所时,交易所完全保管这些代币,并且交易所有能力使用这些代币进行投票。但 Vitalik 认为目前无论哪种贿选解决方案只是权宜方法,当前区块链和 DAO 到现在避免这些严重的贿选攻击还是更多依赖其他因素。综上,这些措施大多只能算缓兵之计,治理 Token 的重要问题是其功能单一,解决还需要拓展其基本功能,不再局限于简单的治理。普通群:不定期有财富密码分享VIP群:以深入分析为基础让每个人进群成员都能读懂区块链提高专业认知,由我们专业的老师保驾护航确保vip群内成员的本金安全,让大家获得应得的回报。我们最重要的核心就是共赢为基础,让我们的会员能够把握后期区块链的百倍红利发布于 2022-12-08 12:25赞同添加评论分享收藏喜欢收起
对于token的认证,如何保证token的及时刷新? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册Web 开发JSON Web Token(JWT)token对于token的认证,如何保证token的及时刷新?1,在拦截器里对将要过期的token 的进行刷新。(一个页面可能n个请求同时发出,也就是说 refresh_token 要支持多个,这个不算最好的解决…显示全部 关注者26被浏览88,408关注问题写回答邀请回答好问题添加评论分享4 个回答默认排序张少林同学 关注前言记录一下前后端分离下————token超时刷新策略!需求场景昨天发了一篇记录 前后端分离应用——用户信息传递 中介绍了token认证机制,跟几位群友讨论了下,有些同学有这么一个疑惑:token失效了,应该怎么做?强制定向到登录页?其实理论上如果是活跃用户,token失效后,假如用户正在操作表单,此时突然定向到登录页面,那用户体验太差了。实现目标延长token过期时间活跃用户在token过期时,在用户无感知的情况下动态刷新token,做到一直在线状态不活跃用户在token过期时,直接定向到登录页登录返回字段如何签发token,请看上一篇推文,这里不做过多介绍。先看看登录接口返回的数据如下: 1@Data
2public class LoginVo implements Serializable {
3
4 private static final long serialVersionUID = 6711396581310450023L;
5
6 //...省略部分业务字段
7
8 /**
9 * token令牌 过期时间默认15day
10 */
11 private String jwt;
12
13 /**
14 * 刷新token 过期时间可以设置为jwt的两倍,甚至更长,用于动态刷新token
15 */
16 private String refreshJwt;
17
18 /**
19 * token过期时间戳
20 */
21 private Long tokenPeriodTime;
22
23}
具体返回字段的意义请看注释,这里再简要说明:jwt:用户正常访问接口时提交的token,过期时间设置长一些,15day吧refreshJwt:刷新token 过期时间可以设置为jwt的两倍,甚至更长,用于动态刷新token时候提交后台验证tokenPeriodTime:token过期时间戳,前端每次调用接口前需要主动判断是否已经过期,如果过期则提交refreshJwt访问token刷新的接口进行刷新动态刷新token前端检测到token过期后,携带refreshJwt访问后台刷新token的接口,服务端在拦截器中依然对refreshJwt进行解析鉴权假如refreshJwt也过期了,提示登录过期,强制跳转登录页假如refreshJwt还在有效期,则签发新的token返回,前端使用最新的token进行接口请求总结如果是活跃用户,那么允许他在refreshJwt过期时间与token过期时间的差值这段时间内,不停的动态刷新token,使其做到无感知的状态下一直保持登录状态如果用户不活跃,在refreshJwt过期时间到了,依然没有使用系统,那么将判定为不活跃用户,此时应当重定向到登录页了最后篇幅较短,主要是延续上一篇 前后端分离应用——用户信息传递 遗留问题做一下总结。如果你有更好的做法,欢迎留言告知我,谢谢啦。后续会不定期更新原创文章,欢迎关注公众号 「张少林同学」!编辑于 2019-01-22 12:22赞同 167 条评论分享收藏喜欢收起编程乐趣 关注这是我之前分享在星球里面的课程,下面整理下,分享下这个无感刷新Token技术方案。我们都知道Token是有设置有效期的,为了安全都不会设置过长的有效期;但设置有效期太短,又会导致经常需要重新登录。这就需要无感刷新Token的方案,来提升用户体验。目前比较常用的方案是:双token机制。1、登录时同时返回:Token、RefreshToken,Token用于请求业务接口,RefreshToken用于刷新Token接口;2、每一次Http请求,客户端都会判断服务器返回状态,如果是401,代表Token过期;3、客户端使用RefreshToken,请求服务器Token刷新接口,并获取新的:Token,RefreshToken;4、如果第3步骤成功返回,更新本地的Token、RefreshToken;如果返回失败,代表RefreshToken也过期了,提示过期并跳转至登录页面。下面我们一起看下实现步骤:1、后台登录接口登录验证,验证用户名和密码,验证通过返回Token。登录接口返回的2个内容:Token和RefreshToken,这两个有效期不一样,比如Token有效期是30分钟,RefreshToken有效期是60分钟。2、后台刷新token接口和登录接口一样,也是返回:Token和RefreshToken。3、前端登录功能在前端登录页面,成功登录后,把Token和RefreshToken存储在本地,可以存储在Cookie或者LocalStorage。4、错误响应拦截器axios响应拦截器添加如下代码:a、判断Http返回状态是否为401。b、判断是否授权信息是否使用refreshToken,调用刷新token接口,同样也会发起Http请求,如果refreshToken也过期了,同样会返回401;所以这边要加判断,避免进入死循环。c、如果refreshToken也过期了,直接跳转至登录页面。d、如果调用刷新token接口成功返回,更新本地存储的Token、RefreshToken;并获取上一次业务请求的内容,并更新验证信息,重新发起上一次业务请求,这样才能实现无感刷新。5、实现效果最终实现效果如下:1、请求用户列表接口,返回401;2、调用token刷新接口;3、重新请求用户列表接口。在这过程中,第一次发起用户搜索请求是失败的,我们马上刷新token,并重新发起第二次用户搜索请求,但对用户来说是透明、毫无察觉的。好了,今天就分享到这了。顺便分享一个资料:最后,如果对你有帮助,欢迎点赞、收藏!- End -发布于 2024-02-02 23:28赞同 11 条评论分享收藏喜欢收起
App token常用处理机制 和 token失效会带来什么后果? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册移动开发App token常用处理机制 和 token失效会带来什么后果?App 调用登录接口返回用户的token信息,token信息存储在本地,以后每个接口都发送token,如果服务器验证token失效,一般客户端都会怎么…显示全部 关注者16被浏览19,967关注问题写回答邀请回答好问题添加评论分享1 个回答默认排序知乎用户其实把流程捋清楚了也很简单,题主说到了返回用户的Token信息。在大多数情况下Token和Cookie的作用是一样的,用来保存用户的某一些状态。Cookie一般由浏览器或者客户端自动维护失效状态,服务端也可以根据请求头中的Cookie信息来判断用的某一些状态的合法性,例如登录状态。那么Token就不一样了,它不是Http协议中定义的东西,所以客户端和浏览器都没有对它进行一个规范的实现,因此它由服务端软件和客户端软件来根据自身需求来各自实现,一般服务端会采用标准化的JWT(JSON Web Token)。Token的好处也是显而易见的,比如可以轻松跨域、解耦性更强、对移动端更加友好等……了解原理要想真正的搞懂题主的问题,一定要对Token的工作原理和完整的协作流程有一个清晰的认知,因此咱们先来大致了解一下Token的原理和工作流程。服务端有一个管理Token的缓存类,我们暂且把它叫做TokenCache。说到缓存无非就是增加、删除和查询,再加上一些类似LRU的算法做优化,当客户端登录后服务端会根据当前用户的属性生成一个加密的Token,然后缓存到这个TokenCache中,当客户端请求某个接口时,服务端首先会检查客户端是否携带了Token,然后检查Token是否在TokenCache中以验证有效期,最后根据算法解密Token做一些权限逻辑判断。注:这只是一个笼统的过程,很多服务端语言不完全如是。下面用几个具有代表性的场景配合几张图来说明客户端和服务端的协作流程。不用登录就可以成功请求;也就是不管是否携带了Token,不管Token是否有效就可以正常请求,比如App首页:2. 需要登录后才可以成功请求,但是用户并没有登录时;没有登录时请求时服务端会返回类似401这样的状态码,表示客户端需要登录后才能正常请求:3. 当客户端进行登录操作时;当客户端在第2步检测到服务端返回无效登录状态时,先应该判断用户是否登录过了,如果用户没有登录客户端应该跳转到登录页面让用户登录:4. 需要登录后才可以成功请求,并且用户已经正常登录后;这种场景下客户端应该携带了Token,而且Token是有效的:5. 当用户登录后,过长时间没有请求任何接口,例如登录App就从未打开过,此时服务端保存的Token可能已经失效了,服务端也会返回类似401这样的状态码:这种场景往往很难查错,往往也是客户端和服务端同学互相甩锅的地方,这一点也是题主提出的问题,当Token失效后到底该怎么办?解决方案到这一步我们该总结一下出现问题的两个地方了,除了用户正常点击登录按钮去登录外,有两个地方需要客户端程序自动处理需要登录这个状态。在上述第2步和第5步都会出现登录失效的状态。在此先给出一些比较常见的处理建议:当接口响应401时,客户端应该先检查用户是否已经登录过了。如果用户没有登录过,客户端程序应该跳转到登录页面让用户登录后再操作。如果用户登录过,客户端程序应该自动替用户登录,然后再重新请求之前响应401的接口。第2步很简单,对于第3步就显得有一点复杂了,其实也并不复杂,只是有一部分客户端开发者遇到这个问题时会想,那么多接口请求,难道每一个接口我都需要这样做吗?其实客户端只需要在上面几张图的HttpProcessor处插入一段业务即可,大概流程是这样的:根据上图中的步骤,我们把插入业务这一段叫做业务拦截器,下面我用伪代码做个示例。1. 这是负责请求服务端的Http类:2. 这是插入业务的核心,业务拦截器:3. 这是处理失效时跳转和其它一些通用业务的HttpManager封装4. 调用的时候也就很简单了,释放天性咯总结现在来总结一下题主的问题,当用户登录后应该加密后保存用户帐号密码,当请求接口时接受到Token失效状态,此时应该检查用户是否登录过,也就是检查是否有保存用户帐号密码,如果没有登录过则直接跳转登录页面让用户登录,如果用户登录过则使用已经保存的帐号密码尝试登录一次,登录成功则重新请求之前返回登录失效状态的接口,如果登录失败则跳转登录页面让用户登录。其中没有登录过跳转登录页面和拦截状态后登录失败跳转登录页面其实最终是一个步骤了,因为客户端只是插入了一段业务而已。编辑于 2018-04-20 09:29赞同 258 条评论分享收藏喜欢收起
大家好,我是李俊辉!我会把精彩文章在深入看懂的基础上,过滤出精华转载过来,推荐给大家,分享给更多的人参考和学习。如果您觉得文章有用,请帮忙点个赞或关注,也为我鼓励一下,坚持写下去!
对于 Token,在很多大型网站中都有所应用,比如 Facebook,Twitter,Google,Github 等等,比起传统的身份验证方法,Token 的扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。
1.基于Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
客户端使用用户名跟密码请求登录;
服务端收到请求,去验证用户名与密码;
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
2.JWT
实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:
1.header(头部),头部信息主要包括(参数的类型--JWT,签名的算法--HS256)
2.poyload(负荷),负荷基本就是自己想要存放的信息(因为信息会暴露,不应该在载荷里面加入任何敏感的数据)
3.sign(签名),签名的作用就是为了防止恶意篡改数据,下边会详细说明
中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
2.1 Header
Header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256。
{
"typ" : "JWT",
"alg" : "HS256"
}
上面的内容要用 Base64 的形式编码一下,所以就变成这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2.2 Payload
Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
比如下面这个 Payload,用到了 iss 发行人,exp 过期时间,另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
{
"iss" : "csdn.net",
"exp" : "201511205211314",
"name" : "维C果糖",
"admin" : true
}
使用 Base64 编码以后就变成了这个样子:
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
2.3 Signature
JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header 和 payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
header
payload
secret
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret');
处理完成以后看起来像这样:
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。
3.Web安全
Token,我们称之为“令牌”,其最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。那么,Token 有什么作用?又是什么原理呢?
Token 一般用在两个地方:
`防止表单重复提交;
Anti CSRF 攻击(跨站点请求伪造)。`
两者在原理上都是通过 session token 来实现的。当客户端请求页面时,服务器会生成一个随机数 Token,并且将 Token 放置到 session 当中,然后将 Token 发给客户端(一般通过构造 hidden 表单)。下次客户端提交请求时,Token 会随着表单一起提交到服务器端。
然后,如果应用于“Anti CSRF攻击”,则服务器端会对 Token 值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。不过,如果应用于“防止表单重复提交”,服务器端第一次验证相同过后,会将 session 中的 Token 值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的 Token 没变,但服务器端 session 中 Token 已经改变了。
上面的 session 应用相对安全,但也叫繁琐,同时当多页面多请求时,必须采用多 Token 同时生成的方法,这样占用更多资源,执行效率会降低。因此,也可用 cookie 存储验证信息的方法来代替 session Token。比如,应对“重复提交”时,当第一次提交后便把已经提交的信息写到 cookie 中,当第二次提交时,由于 cookie 已经有提交记录,因此第二次提交会失败。不过,cookie 存储有个致命弱点,如果 cookie 被劫持(XSS 攻击很容易得到用户 cookie),那么又一次 game over,黑客将直接实现 CSRF 攻击。所以,安全和高效相对的,具体问题具体分析吧!
此外,要避免“加 token 但不进行校验”的情况,在 session 中增加了 token,但服务端没有对 token 进行验证,这样根本起不到防范的作用。还需注意的是,对数据库有改动的增、删、改操作,需要加 token 验证,对于查询操作,一定不要加 token,防止攻击者通过查询操作获取 token 进行 CSRF攻击。但并不是这样攻击者就无法获得 token,只是增大攻击成本而已。
4.结合后端开发再次理解token生成过程
在Java的实现中可以有两种方式,一种是不借助第三方jar,自己生成token,另一种的借助第三方jar,传入自己需要的负荷信息,生成token。接下来就根据这两个逐个说明。Token的组成就是header.poyload.sign。
4.1自己生成token:
header和poyload的组成都是json字符串,所以先创建头部的json,然后用base64编码(org.apache.axis.encoding.Base64),这里选择的base64要对应着编码和解码(Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程)。然后再创建负荷的json,然后也同样用base64编码,这样就生成了两个字符串,然后用.拼接到一起就形成了现在的形式:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0。
在这里只是给大家一个演示,
实际中根据每个人的负荷参数的不同,编码后所生成的字符串也不同。因为没有借助第三方的jar,
所有接下来要对上边拼接成的字符串进行hs256的算法加密生成sign签名,这里需要自己手动去写一个类,然后提供一
个静态方法供外界的调用。
类的实现代码如下:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class HS256 {
public static String returnSign(String message) {
String hash = "";
//别人篡改数据,但是签名的密匙是在服务器存储,密匙不同,生成的sign也不同。
//所以根据sign的不同就可以知道是否篡改了数据。
String secret = "mystar";//密匙
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key);
hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(message+"#####"+hash);
} catch (Exception e) {
System.out.println("Error");
}
return hash;
}
}
这样token的三部分就生成了,然后当做参数传到前台,用cookie或者localstore(推荐)存储就可以在同一客户端调用了。
当从客户端带过来token参数的时候,直接对头部和负荷再次调用加密算法,看生成的新的签名和之前的签名是否一致,判断数据是否被篡改。
4.2借用第三方的jar(jjwt-0.7.0.jar)生成token:
在这里自己已经通过代码测试,直接先看代码:
java后端生成token代码
调用这个方法会自动对header和poyload进行base64的编码,你看过源码就知道它用的是哪一种,用的是自己jar包自带的(io.jsonwebtoken.impl.Base64Codec),跟自己生成token时,用的base64的jar不一样,自己在此列出来:
public static void main(String[] args) {
// String token = createJWT("11","22","222",11);
// System.out.println(token);
JSONObject json_header = new JSONObject();
json_header.put("typ", "JWT");//类型
json_header.put("alg", "HS256");//加密算法
// String header =
// org.apache.axis.encoding.Base64.encode(json_header.toString().getBytes());
String header = Base64Codec.BASE64URL.encode(json_header.toString()
.getBytes());
String aa = Base64Codec.BASE64URL.decodeToString(header);
System.out.println(header + "--" + aa);
}
接着上边createJWT()方法说,只要把自己定义的负荷json串当做参数传入就行,并且签名也会对应的生成,返回一个完整的token。在测试的过程中,发现即使自己不定义token的头部,也会自动生成header,只是里边没有typ这样的参数定义,只有HS256,这里源码里边,默认了alg的value。在这里我想说明的是,假如外界会篡改参数,他肯定也知道构成,会把负荷里边的参数取出来,也许会修改,然后编码放回去,但是头部的信息对他来说用处不大,所以自己在这个方法里边,默认把头部加上,负荷的值还是自己在调用的时候传入进来。这样执行完,把生成的token就当做参数传到前台,存储在cookie里边。
然后再说一下,前台带过来token参数时候,怎么处理,看代码:
token对比代码
这个过程的原理跟自己生成token判断原理一样,都是从新生成sign,只是一个是调用自己的方法,另外一个是调用第三方的方法,自己看了源码(public abstract JwtBuilder signWith(SignatureAlgorithm paramSignatureAlgorithm, String paramString);),没能单独把第三方生成sign的方法提出来,只是一个接口,但是跟上边的加密算法实现原理应该是基本一致的。
至此,token签名这一块的问题大致就先说到这了,然后再来说一下token过期时间问题。这个相对来说不是太复杂,可以在负荷里边多带一个参数,把过期时间放进去,其实里边有一个exp标签名就是存储过期时间字段的,但是自己在测试过程中,发现每次读出来的都是最原始的时间,自己当时也再花时间去看,因为我觉得自己带参数其实一个道理。存储的是时间戳。
存储:
long nowMillis = System.currentTimeMillis();
long expMillis = nowMillis + 1000*2;//设置token二秒过期
获取:
Date aa = new Date(Long.parseLong(claims.get("aa").toString()));
方式就是这样了,我大概列了出来。到时可以存储一个生成token时间和token过期时间,然后服务器接收到的时候,可以根据当前的时间去判断。当前时间大于token生成时间并且小于token过期时间的情况下,继续走你接下来的业务操作。
5.token被劫持了,怎样解决这个安全问题
a、在存储的时候把 token 进行对称加密存储,用时解开。
b、将请求 URL、时间戳、token 三者进行合并加盐签名,服务端校验有效性。
c、HTTPS 对 URL 进行判断。
HTTP 协议是无状态的,在web中使用cookie+session的技术来保持用户登陆的状态
移动端使用token来保持用户登陆状态由于token在网络中传输,很容易被中间人获取,进而模拟用户进行其他相关操作
解决办法:
服务器端
响应头增加随机字符串 CSRF_TOKEN=xxxxxxxxxxx(每次请求都不同)
客户端
客户端和服务端 保留密钥 secret = yyyyyyyyy
客户端获取响应头CSRF_TOKEN下次请求必须携带
客户端 (secret+提交内容) 进行签名
当用户提交信息到服务器端,首先验证签名数据是否被篡改,随后通过token+随机字符串比对,正确的话执行操作,刷新随机字符串,即使token被中间人获取到了,没有随机字符串依旧执行不了任何操作,再糟糕点中间人通过拦截响应头获取到了随机字符串,但是密钥还没泄露,没有办法进行签名依旧执行不了操作
缺点:
以上解决办法只适用于APP端,浏览器端不适用,因为没地方保存密钥
总结:
所以能上 HTTPS 就用 HTTPS 吧!
名称解释:
[1] XSS 攻击:跨站脚本攻击(Cross Site Scripting),恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
[2] CSRF 攻击:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者 Session Riding,通常缩写为 CSRF 或者 XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与 XSS 非常不同,XSS 利用站点内的信任用户,而 CSRF 则通过伪装来自受信任用户的请求来利用受信任的网站。与 XSS 攻击相比,CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比 XSS 更具危险性。
————————————————
如果你觉李俊辉的文章对您有用,请帮忙点个赞或关注,也为我鼓励一下,坚持写下去,在此感谢!
转载请一定注明出处!
原文地址:https://www.jianshu.com/p/1422374a404b
本文参考链接:
https://blog.csdn.net/qq_35246620/article/details/55049812
https://blog.csdn.net/buyaoshuohua1/article/details/73739419?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/weixin_30677617/article/details/101518468?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/weixin_43644324/article/details/87895729
最后编辑于 :2020.03.12 01:58:19©著作权归作者所有,转载或内容合作请联系作者人面猴序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...沈念sama阅读 147,303评论 1赞 313死咒序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...沈念sama阅读 62,922评论 1赞 261救了他两次的神仙让他今天三更去死文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...开封第一讲书人阅读 98,010评论 0赞 216道士缉凶录:失踪的卖姜人 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...开封第一讲书人阅读 41,858评论 0赞 188港岛之恋(遗憾婚礼)正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...茶点故事阅读 49,788评论 1赞 265恶毒庶女顶嫁案:这布局不是一般人想出来的文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...开封第一讲书人阅读 39,250评论 1赞 183城市分裂传说那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...沈念sama阅读 30,799评论 2赞 281双鸳鸯连环套:你想象不到人心有多黑文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...开封第一讲书人阅读 29,547评论 0赞 175万荣杀人案实录序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...沈念sama阅读 32,966评论 0赞 221护林员之死正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...茶点故事阅读 29,653评论 2赞 225白月光启示录正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...茶点故事阅读 31,010评论 1赞 236活死人序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...沈念sama阅读 27,439评论 2赞 220日本核电站爆炸内幕正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...茶点故事阅读 31,906评论 3赞 214男人毒药:我在死后第九天来索命文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...开封第一讲书人阅读 25,738评论 0赞 9一桩弑父案,背后竟有这般阴谋文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...开封第一讲书人阅读 26,212评论 0赞 173情欲美人皮我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...沈念sama阅读 34,010评论 2赞 238代替公主和亲正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...茶点故事阅读 34,152评论 2赞 241推荐阅读更多精彩内容session和token的关系和区别?普遍的回答: cookie和session的区别:cookie存储在客户端,session存储在服务器 token...SMEB_阅读 7,154评论 0赞 14基于 Token 的身份验证基于 Token 的身份验证,很多大型网站也都在用,比如 Facebook,Twitter,Google+,Git...杰哥长得帅阅读 981评论 0赞 3WEB后台--基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和se...继续这一个系列,基于Token的WEB后台登录认证机制(并讲解cookie和session机制)。每个后端不得不解...JackFrost_fuzhu阅读 17,793评论 11赞 80cookie,token验证的区别目前全文是翻译的,讲的主要是 cookie 验证和 token 验证的区别,cookie 验证准确的说是利用 co...吃柠檬的刺猬阅读 28,913评论 11赞 21基于Token的WEB后台认证机制:Token一、常见的集中认证机制 1、HTTP Basic Auth 在每次访问 API 时,都要提供用户的username...慕凌峰阅读 8,998评论 2赞 24评论1赞2626赞27赞赞赏更
token失效处理 - 知乎切换模式写文章登录/注册token失效处理大鱼海棠●第一种方案是:服务器端保存token状态,用户每次操作都会自动推迟token的过期时间,session就是采用这种策略保持token的有效期,但是当前后端分离,单页面的时候,每秒钟的请求发起多次,每次都去刷新一下过期时间会非常消耗性能的;●第二种方案:使用refresh token,避免频繁的刷新token,此时服务端只要在token过期的时候反馈给前端,前端使用refresh token申请一个全新的token继续使用即可在处理token失效的问题时,可以采取以下步骤:在token失效后,对于服务器的响应结果,一般情况下前端和后端会就code的值做一个约定,这里我们对于token超时导致的请求异常的code返回值约定为10002。在接收到服务器响应的第一时间判断code的值是否为10002。也就是在响应拦截器中进行code值的判断。如果code值为10002,则表示token失效。如果token失效,那么将页面跳转到登陆界面(login)并将本地cookies和Vuex中存储的失效token清除。这里的removeToken是外部导入的清除本地cookies里token的方法。清空失效的token后,根据我们在路由守卫中的判断设定,页面将自动跳转回登陆界面。发布于 2023-11-06 10:56・IP 属地广东token赞同 1添加评论分享喜欢收藏申请
关于Token 自动续期的解决方案 - 知乎首发于JAVA日知录切换模式写文章登录/注册关于Token 自动续期的解决方案JAVA日知录前言在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwt token。前端(如vue)在接收到jwt token后会将token存储到LocalStorage中。后续每次请求都会将此token放在请求头中传递到后端服务,后端服务会有一个过滤器对token进行拦截校验,校验token是否过期,如果token过期则会让前端跳转到登录页面重新登录。因为jwt token中一般会包含用户的基本信息,为了保证token的安全性,一般会将token的过期时间设置的比较短。但是这样又会导致前端用户需要频繁登录(token过期),甚至有的表单比较复杂,前端用户在填写表单时需要思考较长时间,等真正提交表单时后端校验发现token过期失效了不得不跳转到登录页面。如果真发生了这种情况前端用户肯定是要骂人的,用户体验非常不友好。本篇内容就是在前端用户无感知的情况下实现token的自动续期,避免频繁登录、表单填写内容丢失情况的发生。实现原理jwt token自动续期的实现原理如下:登录成功后将用户生成的 jwt token 作为key、value存储到cache缓存里面 (这时候key、value值一样),将缓存有效期设置为 token有效时间的2倍。当该用户再次请求时,通过后端的一个 jwt Filter 校验前端token是否是有效token,如果前端token无效表明是非法请求,直接抛出异常即可;根据规则取出cache token,判断cache token是否存在,此时主要分以下几种情况:cache token 不存在这种情况表明该用户账户空闲超时,返回用户信息已失效,请重新登录。cache token 存在,则需要使用jwt工具类验证该cache token 是否过期超时,不过期无需处理。过期则表示该用户一直在操作只是token失效了,后端程序会给token对应的key映射的value值重新生成jwt token并覆盖value值,该缓存生命周期重新计算。实现逻辑的核心原理:前端请求Header中设置的token保持不变,校验有效性以缓存中的token为准。代码实现(伪码)登录成功后给用户签发token,并设置token的有效期...
SysUser sysUser = userService.getUser(username,password);
if(null !== sysUser){
String token = JwtUtil.sign(sysUser.getUsername(),
sysUser.getPassword());
}
...
public static String sign(String username, String secret) {
//设置token有效期为30分钟
Date date = new Date(System.currentTimeMillis() + 30 * 60 * 1000);
//使用HS256生成token,密钥则是用户的密码
Algorithm algorithm = Algorithm.HMAC256(secret);
// 附带username信息
return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
}
将token存入redis,并设定过期时间,将redis的过期时间设置成token过期时间的两倍Sting tokenKey = "sys:user:token" + token;
redisUtil.set(tokenKey, token);
redisUtil.expire(tokenKey, 30 * 60 * 2);
过滤器校验token,校验token有效性public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//从header中获取token
String token = httpServletRequest.getHeader("token")
if(null == token){
throw new RuntimeException("illegal request,token is necessary!")
}
//解析token获取用户名
String username = JwtUtil.getUsername(token);
//根据用户名获取用户实体,在实际开发中从redis取
User user = userService.findByUser(username);
if(null == user){
throw new RuntimeException("illegal request,token is Invalid!")
}
//校验token是否失效,自动续期
if(!refreshToken(token,username,user.getPassword())){
throw new RuntimeException("illegal request,token is expired!")
}
...
}
实现token的自动续期public boolean refreshToken(String token, String userName, String passWord) {
Sting tokenKey = "sys:user:token" + token ;
String cacheToken = String.valueOf(redisUtil.get(tokenKey));
if (StringUtils.isNotEmpty(cacheToken)) {
// 校验token有效性,注意需要校验的是缓存中的token
if (!JwtUtil.verify(cacheToken, userName, passWord)) {
String newToken = JwtUtil.sign(userName, passWord);
// 设置超时时间
redisUtil.set(tokenKey, newToken) ;
redisUtil.expire(tokenKey, 30 * 60 * 2);
}
return true;
}
return false;
}
...
public static boolean verify(String token, String username, String secret) {
try {
// 根据密码生成JWT效验器
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
// 效验TOKEN
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception exception) {
return false;
}
}
本文中jwt的相关操作是基于 com.auth0.java-jwt 实现,大家可以通过阅读原文获取 JwtUtil 工具类。小结jwt token实现逻辑的核心原理是 前端请求Header中设置的token保持不变,校验有效性以缓存中的token为准,千万不要直接校验Header中的token。实现原理部分大家好好体会一下,思路比实现更重要!如果本文对你有帮助,别忘记给我个三连:点赞,转发,评论。咱们下期见!收藏 等于白嫖,点赞 才是真情!这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取!001:《程序员必读书籍》002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》003:《互联网企业高并发解决方案》004:《互联网架构教学视频》006:《SpringBoot实现点餐系统》007:《SpringSecurity实战视频》008:《Hadoop实战教学视频》009:《腾讯2019Techo开发者大会PPT》010: 微信交流群发布于 2020-07-23 08:18前后端分离token后端技术赞同 2425 条评论分享喜欢收藏申请转载文章被以下专栏收录JAVA日知录公众号同名专栏,专注微服务,架构,数据库等
百度知道 - 信息提示
百度首页
商城
注册
登录
网页
资讯
视频
图片
知道
文库
贴吧采购
地图更多
搜索答案
我要提问
百度知道>提示信息
知道宝贝找不到问题了>_
该问题可能已经失效。返回首页
15秒以后自动返回
帮助
| 意见反馈
| 投诉举报
京ICP证030173号-1 京网文【2023】1034-029号 ©2024Baidu 使用百度前必读 | 知道协议