教育培训 > Token流程是什么?怎么解决超时问题的?描述详细一下?

Token流程是什么?怎么解决超时问题的?描述详细一下?

2020-08-29 19:42阅读(87)

Token流程是什么?怎么解决超时问题的?描述详细一下?:Token机制虽说很早就出现了,但也就是最近十年内才广泛应用的,而很多新手对于Token和Session何时使用区

1

Token机制虽说很早就出现了,但也就是最近十年内才广泛应用的,而很多新手对于Token和Session何时使用区分不了,虽说听说过Token但不知道其原理是啥以及如何使用。

Token是为了解决什么问题而生的?

在Token机制之前,服务器端验证客户端请求是否合法主要是靠Cookie+Session机制来实现的。服务器端会为每个会话都生成一个Session,在高并发场景下会导致Session文件越来越多,不利于管理

而Token是服务器端生成的一串加密字符串(具有生命周期),分配给客户端作为令牌使用,Token的好处就是减轻了服务器端的压力,因为Token是由客户端存储的,而且是无状态的。

Token机制流程

Token超时问题如何解决?

服务器端生成的Token是有生命周期的(过期时间),如果我们拿着已过期的Token去服务器端验证肯定是无法通过的,所以我们要在Token过期之前主动更新Token,方案如下:

1、客户端存储Token时要记录Token的过期时间

客户端拿到服务器生成返回的Token后,需要将Token临时存储起来(SessionStorage、LocalStorage),然后客户端定时检测Token是否已过期,如果过期了则主动向授权服务器重新发起认证请求。

2、由服务器端主动通知客户端进行Token更新

客户端每次的请求中都会带上Token,服务器会对此Token进行校验,如果服务器端发现此Token将会在很短时间内失败,那就重新生成Token并附加到响应体中,客户端获取服务器响应数据时看下是否有Token,如果有则覆盖本地旧的Token即可。


以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

2

Token的流程,可以通过分析登录的流程、退出的流程、置换token的流程分别讨论?

登录的流程

  1. 用户发送登录请求

  2. 认证系统验证登录-查询数据库用是存在该用户

  3. 如果该用户存在,则生成Token存入Redis中,并将该Token返回客户端

  4. 如果该用户不存在则提示登录失败

验证Token

客户端

  • 将Token key附加至header

服务端

  • 从header中取出Token key

  • 通过Token key和Redis中的相关Token信息进行匹配

退出请求流程

  1. 前端发送退出请求

  2. 认证系统验证token信息-从Redis中查询相关Token信息

  3. 如果token无效,提示前端换取token失败

  4. 如果token有效,删除该token并提示前端退出成功

置换token的流程

以下讨论的就是token超时的解决方案

先说下后端处理流程:

  1. 前端请求置换token

  2. 认证系统验证去redis验证相关redis信息

  3. token无效,则置换失败

  4. token有效,则从redis删除相关redis,并返回前端新的token

置换token的前端处理流程

  1. 前端在登录成功后拿到token设置到cookie中

  2. 请求业务接口时获取token,并判断是否到了该换取token的时间段了

  3. 如果可以调用置换token接口,重新生成token,返回前端设置到cookie中

以上就是token的请求流程,及token超时的解决方案!!

希望能够帮助到你!!

3

Token

Token是服务端生成的一串字符串,可以看做客户端进行请求的一个令牌,客户端在请求网络上某些资源的时候,必须带着这块令牌(通行证)。

当客户端第一次访问服务端,服务端会根据传过来的唯一标识userId,运用一些加密算法,生成一个Token,客户端下次请求时,只需要带上Token,服务器收到请求后,会验证这个Token。

有些公司会建设统一登录系统(单点登录),客户端先去这个系统获取Token,验证通过再拿着这些Token去访问其他系统;API Gateway也可以提供类似的功能,我们公司就是这样,客户端接入的时候,先向网关获取Token,验证通过了才能访问被授权的接口,并且一段时间后要重新或者Token。

基于Token的认证流程

  1. 客户端使用用户名、密码做身份验证;

  2. 服务端收到请求后进行身份验证;(也可能是统一登录平台、网关)

  3. 验证成功后,服务端会签发一个Token返回给客户端;

  4. 客户端收到Token以后可以把它存储起来;每次向服务端发送请求的时候,都要带着Token;

  5. Token会有过期时间,过期后需要重新进行验证;

  6. 服务端收到请求,会验证客户端请求里面的Token,验证成功,才会响应客户端的请求;

Token过期时间及超时刷新策略

因为Token是访问资源的凭证,所以必须要有过期时间。否则一次认证通过就可以永久使用资源,那么认证功能也就失去了意义,所以Token需要有过期时间。

  • Token的过期时间很容易甚至,在生成Token的元素中,增加时间戳即可;然后在验证过程中,判断是否超时;Token的超时时间不宜过长,也不宜过短,我们项目设置的是1个小时。

  • Token过期之后,需要重新获取,一种方式是重新来一遍获取Token的过程(比如重新登录),这种做法实现起来简单,但是用户体验不好;另外一种主动刷新Token,在过期后自动续约,或者定时任务定期去刷新Token,以保持Token始终在有效期内;我们现在采用被动的方式获取和更新Token。

希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

4

对于编程初学者来说,几乎总是弄不清Token和Session的区别,也并不了解为何要用Token或者Session,尤其是对目前只学过单页开发的人员来说,Session完全可以说是过去时了。

简单点说Token就是服务器端生产了一串字符串令牌,而且返回给客户端进行存储,在下一次请求时将这串令牌放在请求头Header上,就无需每次在带上用户名和密码进行校验,这样就可以减少对数据库的查询操作,减轻服务器的压力。


在Token未兴起之时,其实大部分都是采用的Session机制,有服务器端保有Session会话对象,客户端则是需要通过Cookie中的SessionId回传到服务器来判断当前会话是否存在,若存在则是已登录,若不存在则是失效未登录!这也是Token与Session的区别!当然了Session机制一般要求前端代码与后端代码放在同一域名服务器下,虽然目前有很多跨服务器Session同步,但是那个就比较麻烦了。

而Token则是完全满足了目前前后端分离的需求,更是可以实现前端和后端项目的分别负载均衡。那么如何解决Token超时过期问题呢?这儿就需要对Token的时间进行存储并更新,也就是保留用户最后一次请求服务器的时间,然后下一次请求与该时间进行比对校验,若间隔大于自己设置的超时期限,那么就是过期超时退出,那么如何在自己设置的间隔范围之内,那么该Token有效时间就顺延下去,以此类推,这样就可以完成对应Token的超时过期问题。


以上就是我的回答,也是目前我在项目中进行使用的解决办法,希望能够对你有所帮助和解答,我是路飞写代码,欢迎关注我,一起分享知识!

5

Token的运用流程:当用户首次登录成功之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;

客户端拿到 token 值之后,进行保存 (保存位置由服务器端设置);

以后客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器.;

服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值进行比较;

如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态;

如果没有这个 token 值, 没有登录成功;

如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录。

但一直有个问题就是超时,延时还要重新登录!那该怎么解决呢?

服务器端生成的Token是有生命周期的(过期时间),如果我们拿着已过期的Token去服务器端验证肯定是无法通过的,所以我们要在Token过期之前主动更新Token,方案如下:

1、客户端存储Token时要记录Token的过期时间

客户端拿到服务器生成返回的Token后,需要将Token临时存储起来(SessionStorage、LocalStorage),然后客户端定时检测Token是否已过期,如果过期了则主动向授权服务器重新发起认证请求。

2、由服务器端主动通知客户端进行Token更新

客户端每次的请求中都会带上Token,服务器会对此Token进行校验,如果服务器端发现此Token将会在很短时间内失败,那就重新生成Token并附加到响应体中,客户端获取服务器响应数据时看下是否有Token,如果有则覆盖本地旧的Token即可

____________________________________________________________________________________

回答不易,喜欢的朋友请点赞,转发,评论哦!

6

首先你要明白token最初的设计思路和目的,并不是很多人所谓的用redis存储什么东西,那样只是session共享的一种方式,token实际上是一串字符串,这个字符串是将登录信息用特定手段进行加密之后,由客户端存储,并在每次请求中携带,用于验证身份的一个令牌机制,也就是说这个字符串本身就包含登录的信息,并不需要其他的redis之类的机制来保存其他信息,也就是说他是无状态的,有效性的判定标准由后端的特定逻辑来确定的,而token在第一次登录之后,由后端计算完成,并发送至客户端并存储,对于客户端来说,之后的每次路由跳转,网络请求,都需要携带这个token,用来告诉路由守卫也好,服务提供者也好,我当前是谁在操作,这个操作是不是被允许,仅此而已,如果需要当前登录用户的详细信息,可以在登陆的时候存到类似vuex等状态保持机制中去,随用随取,所以这种机制下,redis完全没有用处。

7

Token验证流程:

1.背景介绍

传统身份验证的方法

HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在Cookie里,下次这个用户再向服务端发送请求的时候,可以带着这个Cookie,这样服务端会验证一个这个Cookie里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是Session,我们需要在服务端存储为登录的用户生成的Session,这些Session可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的Session。

基于Token的身份验证方法

使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个Token,再把这个Token发送给客户端

客户端收到Token以后可以把它存储起来,比如放在Cookie里或者LocalStorage里

客户端每次向服务端请求资源的时候需要带着服务端签发的Token

服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据

传统身份验证的方法

HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在Cookie里,下次这个用户再向服务端发送请求的时候,可以带着这个Cookie,这样服务端会验证一个这个Cookie里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是Session,我们需要在服务端存储为登录的用户生成的Session,这些Session可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的Session。

基于Token的身份验证方法

使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个Token,再把这个Token发送给客户端

客户端收到Token以后可以把它存储起来,比如放在Cookie里或者LocalStorage里

客户端每次向服务端请求资源的时候需要带着服务端签发的Token

服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据Tiles起源

最早的Tiles是组装在Struts1.1里面的,主要目的是为了将复数的jsp页面作为一个的页面的部分机能,然后用来组合成一个最终表示用页面用的,这样的话,便于对页面的各个机能的变更及维护。

现在Tiles已经作为一个Apache独立的开源项目维护着。

如果您发现自己在每个页面上都要编写三行相同的JSP代码,或者你想容易地定义复杂的模版布局,那么相信学习Tiles框架会对你有帮助

2.知识剖析

传统身份验证的方法

HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在Cookie里,下次这个用户再向服务端发送请求的时候,可以带着这个Cookie,这样服务端会验证一个这个Cookie里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是Session,我们需要在服务端存储为登录的用户生成的Session,这些Session可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的Session。

基于Token的身份验证方法

使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个Token,再把这个Token发送给客户端

客户端收到Token以后可以把它存储起来,比如放在Cookie里或者LocalStorage里

客户端每次向服务端请求资源的时候需要带着服务端签发的Token

服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据

传统身份验证的方法

HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在Cookie里,下次这个用户再向服务端发送请求的时候,可以带着这个Cookie,这样服务端会验证一个这个Cookie里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是Session,我们需要在服务端存储为登录的用户生成的Session,这些Session可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的Session。

基于Token的身份验证方法

使用基于Token的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个Token,再把这个Token发送给客户端

客户端收到Token以后可以把它存储起来,比如放在Cookie里或者LocalStorage里

客户端每次向服务端请求资源的时候需要带着服务端签发的Token

服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据

3.常见问题

基于服务器验证方式暴露的一些问题

1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。

2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。

3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。在这些问题中,可扩展行是最突出的。因此我们有必要去寻求一种更有行之有效的方法。

4.解决方案

基于Token的身份验证的过程如下:

1.用户通过用户名和密码发送请求。

2.程序验证。

3.程序返回一个签名的token给客户端。

4.客户端储存token,并且每次用于每次发送请求。

5.服务端验证token并返回数据。

token有一定的时效,过期之后需要重新向登陆认证,拿到新的token;

移动客户端向服务器登陆时,需要提供包含token的认证,服务器需要向渠道认证包含token的认证信息,如果渠道返回有效,则认为移动客户端为合法;

过程中经常会断线重连,每次重连过程相当于走一次向服务器登录的过程,服务器也会将token向渠道服务器进行了认证,但是token的时效性,导致一段时间之后的断线重连会被拒绝;

一种解决方案是:每次断线重连的时候,先向服务器登陆,申请新的token;另一种是:当服务器得到的反馈是token已经过期,那么告知客户端重新向渠道服务器获取,然后带着新的token进行断线重连操作。相对于可能频繁的获取token,更趋向于第二种方法,从经验来看,大部分token的时效是按照小时来计算的