首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在react应用程序中访问令牌过期后自动注销

在React应用程序中,访问令牌过期后自动注销是一个常见的需求,以确保用户在会话失效时能够及时得到通知并被重定向到登录页面。以下是实现这一功能的基础概念和相关步骤:

基础概念

  1. 访问令牌(Access Token):用于验证用户身份并授权访问受保护资源的短生命周期令牌。
  2. 刷新令牌(Refresh Token):用于获取新的访问令牌的长生命周期令牌。
  3. JWT(JSON Web Token):一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。

实现步骤

1. 存储令牌

通常将访问令牌存储在localStoragesessionStorage中,而刷新令牌可以存储在更安全的地方,如HTTP-only cookie。

代码语言:txt
复制
// 存储令牌
localStorage.setItem('access_token', accessToken);
document.cookie = `refresh_token=${refreshToken}; path=/; secure; samesite=strict`;

2. 设置拦截器

使用Axios或其他HTTP客户端库设置拦截器,在每次请求前检查访问令牌是否有效。

代码语言:txt
复制
import axios from 'axios';

const api = axios.create({
  baseURL: 'https://api.example.com',
});

api.interceptors.request.use(config => {
  const token = localStorage.getItem('access_token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
}, error => {
  return Promise.reject(error);
});

3. 处理401未授权响应

当服务器返回401状态码时,尝试使用刷新令牌获取新的访问令牌。

代码语言:txt
复制
api.interceptors.response.use(response => {
  return response;
}, async error => {
  const originalRequest = error.config;
  if (error.response.status === 401 && !originalRequest._retry) {
    originalRequest._retry = true;
    try {
      const refreshToken = getCookie('refresh_token');
      const { data } = await axios.post('/auth/refresh-token', { refresh_token: refreshToken });
      localStorage.setItem('access_token', data.access_token);
      originalRequest.headers.Authorization = `Bearer ${data.access_token}`;
      return api(originalRequest);
    } catch (refreshError) {
      // 刷新令牌失败,清除所有令牌并重定向到登录页面
      localStorage.removeItem('access_token');
      document.cookie = 'refresh_token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; secure; samesite=strict';
      window.location.href = '/login';
      return Promise.reject(refreshError);
    }
  }
  return Promise.reject(error);
});

function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}

4. 定时刷新令牌

为了防止用户在长时间操作过程中令牌过期,可以定时刷新访问令牌。

代码语言:txt
复制
setInterval(async () => {
  try {
    const refreshToken = getCookie('refresh_token');
    const { data } = await axios.post('/auth/refresh-token', { refresh_token: refreshToken });
    localStorage.setItem('access_token', data.access_token);
  } catch (error) {
    // 刷新令牌失败,清除所有令牌并重定向到登录页面
    localStorage.removeItem('access_token');
    document.cookie = 'refresh_token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; secure; samesite=strict';
    window.location.href = '/login';
  }
}, 5 * 60 * 1000); // 每5分钟刷新一次

应用场景

  • 单页应用(SPA):如React、Vue.js等前端框架构建的应用。
  • 需要长时间会话的应用:如在线编辑器、实时聊天应用等。

可能遇到的问题及解决方法

  1. 令牌泄露:确保使用HTTPS传输令牌,并考虑使用HTTP-only cookie存储刷新令牌。
  2. 令牌刷新失败:在刷新令牌失败时,及时清除所有令牌并重定向用户到登录页面。
  3. 定时刷新导致的性能问题:合理设置刷新间隔,避免过于频繁的请求。

通过上述步骤,可以有效实现React应用程序中访问令牌过期后的自动注销功能,提升用户体验和应用安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

访问令牌过期后,如何自动续期?

以 com.auth0 为例,下面代码片段实现了生成一个带有过期时间的token JWT设置了过期时间以后,一定超过,那么接口就不能访问了,需要用户重新登录获取token。...如果经常需要用户重新登录,显然这种体验不是太好,因此很多应用会采用token过期后自动续期的方案,只有特定条件下才会让用户重新登录。...如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token 返回给客户端。 客户端携带新的 access_token 重新调用上面的资源接口。...客户端退出登录或修改密码后,注销旧的token,使 access_token 和 refresh_token 失效,同时清空客户端的 access_token 和 refresh_token。...后端实现token过期还可以利用Redis来存储token,设置redis的键值对的过期时间。如果发现redis中不存在token的记录,说明token已经过期了。

2.6K10

owasp web应用安全测试清单

测试帐户锁定和成功更改密码的通道外通知 使用共享身份验证架构/SSO测试应用程序之间的一致身份验证 会话管理: 确定应用程序中如何处理会话管理(例如,Cookie中的令牌、URL中的令牌) 检查会话令牌的...cookie标志(httpOnly和secure) 检查会话cookie作用域(路径和域) 检查会话cookie持续时间(过期和最长期限) 在最长生存期后检查会话终止 检查相对超时后的会话终止 注销后检查会话终止...测试用户是否可以同时拥有多个会话 随机性测试会话cookie 确认在登录、角色更改和注销时发布了新会话令牌 使用共享会话管理跨应用程序测试一致的会话管理 会话困惑测试 CSRF和clickjacking...测试是否清除了不安全的文件名 测试上载的文件在web根目录中不能直接访问 测试上传的文件是否不在同一主机名/端口上提供 测试文件和其他媒体是否与身份验证和授权模式集成 风险功能-支付: 测试Web服务器和...Web应用程序上的已知漏洞和配置问题 测试默认密码或可猜测密码 在实时环境中测试非生产数据,反之亦然 测试注入漏洞 缓冲区溢出测试 不安全加密存储的测试 测试传输层保护是否不足 测试错误处理是否不当 测试

2.4K00
  • Apache NiFi中的JWT身份验证

    在成功交换凭证之后,NiFi服务生成并返回一个JWT, web浏览器将使用它来处理所有后续请求。这种方法将对身份提供者的影响最小化,还简化了完成登录过程后的应用程序访问。...在NiFi 1.10.0发布更新后,注销用户界面删除了用户当前的对称密钥,有效地撤销了当前令牌,并强制在后续登录时生成一个新的UUID。...过期机制强制令牌拥有有限的生命周期,最长可达12小时,而令牌撤销可以确保完成注销过程后令牌不再有效。...浏览器Local Storage在应用程序重新启动时持续存在,如果用户在没有完成NiFi注销过程的情况下关闭浏览器,令牌将保持持久性,并可用于未来的浏览器会话。...由于JavaScript对HTTP会话cookie的访问限制,更新后的实现还采用了一种不同的方法来注销支持状态。

    4.1K20

    单点登录实现原理(SSO)

    单点登录简介 单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源,若用户在某个应用系统中进行注销登录,所有的应用系统都不能再直接访问保护资源,像一些知名的大型网站,...间接授权通过令牌实现,当用户提供的用户名和密码通过认证中心认证后,认证中心会创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌即得到了授权,然后创建局部会话。...2 用户在登录页面提交用户相应信息后,认证中心会校验用户信息,如果用户信息正确的话认证中心就会创建与该用户的全局会话(全局会话过期的时候,用户就需要重新登录了。...,则用户之前的登录就过期了,用户需要重新登录 #### 2 单点注销 在一个子系统中注销,全局会话也会被注销,所有子系统的会话都会被注销 用户向系统1发出注销请求,系统1根据用户与系统1建立的会话...id从会话中拿到令牌,向SSO认证中心发起注销请求,认证中心校验令牌有效,会销毁全局会话,同时取出此令牌注册的系统地址,认证中心向所有注册系统发出注销请求,各系统收到注销请求后销毁局部会话,认证中心引导用户跳转值登录页面

    84611

    单点登录实现原理(SSO)

    简介 单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源,若用户在某个应用系统中进行注销登录,所有的应用系统都不能再直接访问保护资源,像一些知名的大型网站,如:淘宝与天猫...间接授权通过令牌实现,当用户提供的用户名和密码通过认证中心认证后,认证中心会创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌即得到了授权,然后创建局部会话。...用户在登录页面提交用户相应信息后,认证中心会校验用户信息,如果用户信息正确的话认证中心就会创建与该用户的全局会话(全局会话过期的时候,用户就需要重新登录了。...如果在校验令牌过程中发现客户端令牌和服务器端令牌不一致或者令牌过期的话,则用户之前的登录就过期了,用户需要重新登录 关于令牌可参考:基于跨域单点登录令牌的设计与实现 单点注销 在一个子系统中注销...用户向系统1发出注销请求,系统1根据用户与系统1建立的会话id从会话中拿到令牌,向SSO认证中心发起注销请求,认证中心校验令牌有效,会销毁全局会话,同时取出此令牌注册的系统地址,认证中心向所有注册系统发出注销请求

    1.6K30

    微信、支付宝以及美团等各大开放平台是如何使用OAuth 2.0的?

    到这里,我们可以发现,在开放平台体系中各个系统角色间的交互可以归结为: 当用户小明访问小兔软件的时候,小兔会首先向开放平台的 OAuth 2.0 授权服务去请求访问令牌,接着小兔拿着访问令牌去请求 API...网关服务; 在 API 网关服务中,会做最基本的两种校验,一种是访问令牌的合法性校验,比如访问令牌是否过期的校验,另一种是小兔打单软件的基本信息的合法性校验,比如 app_id 和 app_secret...我们还知道了,小兔打单软件可以拿着这个访问令牌去代表小明访问小明的数据;如果访问令牌过期了,小兔打单软件还可以继续使用刷新令牌来访问,直到刷新令牌也过期了。...现在问题来了,如果小明注销了账号,或者修改了自己的密码,那他之前为其它第三方软件进行授权的访问令牌就应该立即失效。否则,在刷新令牌过期之前,第三方软件可以一直拿着之前的访问令牌去请求数据。...其实,这个案例中解决访问令牌安全问题的方式,不仅仅适用于开放平台,还可以为你在企业内构建自己的 OAuth 2.0 授权体系结构时提供借鉴。

    1.2K50

    Restful安全认证及权限的解决方案

    查找Token是否存在,主要是为了解决用户注销,但Token还在时效内的问题,如果Token在Redis中存在,则说明用户已注销;如果Token不存在,则校验通过。 ...7.用户注销时,服务端需要把还在时效内的Token保存到Redis中,并设置正确的失效时长。  ? 四、在实际环境中如何使用JWT  1.Web应用程序  在令牌过期前刷新令牌。...如设置令牌的过期时间为一个星期,每次用户打开Web应用程序,服务端每隔一小时生成一个新令牌。如果用户一个多星期没有打开应用,他们将不得不再次登录。 ...2.移动应用程序  大多数移动应用程序用户只进行一次登录,定期刷新令牌可以使用户长期不用登录。  但如果用户的手机丢失,则可提供一种方式由用户决定撤销哪个设备的令牌。...在缓存中不保存Token,而是保存一个计数,每次更换Token时,计数加1,这个计数的值会跟用户ID一起加密后保存在新生成的Token中,返回给用户,用户每次访问时携带这个Token。

    2.9K50

    一文理解JWT鉴权登录的应用

    如果accesstoken没有过期,服务端鉴权后返回给客户端需要的数据。...refreshtoken的自动续期 在某些业务场景,业务方想要用户鉴权自动续期(即用户长期不需要手动登录或者永久不需要手动登录直到手动取消授权)。...在refreshtoken过期之前更换新的refreshtoken。将refreshtoken过期时间设置为7天,并在每次用户打开应用程序并每隔一定时间(例如1小时)刷新令牌。...为了防止客户端更换或注销,需要以某种方式对JWT进行识别,应用程序需要提供注销的方法。...例如使用设备的名称例如“xiaohui的iPad”来标记对应的JWT,然后用户可以去应用程序撤销访问“xiaohui的iPad”,从而注销掉refreshtoken。

    2.9K41

    单点登录原理与简单实现(单点登录原理与简单实现)

    SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。...(); session.setAttribute( "isLogin" , true );   用户再次访问时,tomcat在会话对象中查看登录状态...  用户在sso认证中心登录成功后,sso-server创建授权令牌并存储该令牌,所以,sso-server对令牌的校验就是去查找这个令牌是否存在以及是否过期,令牌校验成功后sso-server将发送校验请求的系统注册到...sso认证中心(就是存储起来的意思)   令牌与注册系统地址通常存储在key-value数据库(如redis)中,redis可以为key设置有效时间也就是令牌的有效期。...redis运行在内存中,速度非常快,正好sso-server不需要持久化任何数据。   令牌与注册系统地址可以用下图描述的结构存储在redis中,可能你会问,为什么要存储这些系统的地址?

    1.7K40

    退出登录时如何让JWT令牌失效?

    额,社会本就复杂别再欺骗自己了好么,被你在客户端删掉的JWT还是可以通过服务器端认证的。 使用JWT要非常明确的一点:JWT失效的唯一途径就是等待时间过期。...2、黑名单 黑名单的逻辑也非常简单:注销时,将JWT放入redis中,并且设置过期时间为JWT的过期时间;请求资源时判断该JWT是否在redis中,如果存在则拒绝访问。...逻辑很简单,直接将退出登录的JWT令牌的jti设置到Redis中,过期时间设置为JWT过期时间即可。代码如下: 图片 OK了,至此已经实现了JWT注销登录的功能……....测试 业务基本完成了,下面走一个流程测试一下,如下: 1、登录,申请令牌 图片 2、拿着令牌访问接口 该令牌并没有注销,因此可以正常访问,如下: 图片 3、调用接口注销登录 请求如下: 图片 4、拿着注销的令牌访问接口...由于令牌已经注销了,因此肯定访问不通接口,返回如下: 图片 源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9529 获取!

    2.6K50

    Spring Security 结合 Jwt 实现无状态登录

    例如登录:用户登录后,我们把用户的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session,然后下次请求,用户携带cookie值来(这一步有浏览器自动完成),我们就能识别到对应...2.Payload:载荷,就是有效数据,在官方文档中(RFC7519),这里给了 7 个示例信息: iss (issuer):表示签发人 exp (expiration time):表示token过期时间...步骤翻译: 应用程序或客户端向授权服务器请求授权 获取到授权后,授权服务器会向应用程序返回访问令牌 应用程序使用访问令牌来访问受保护资源(如API) 因为 JWT 签发的 token 中已经包含了用户的身份信息...注销问题,由于服务端不再保存用户信息,所以一般可以通过修改 secret 来实现注销,服务端 secret 修改后,已经颁发的未过期的 token 就会认证失败,进而实现注销,不过毕竟没有传统的注销方便...密码重置,密码重置后,原本的 token 依然可以访问系统,这时候也需要强制修改 secret。 基于第 2 点和第 3 点,一般建议不同用户取不同 secret。

    91020

    Spring Security 结合 Jwt 实现无状态登录

    例如登录:用户登录后,我们把用户的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session,然后下次请求,用户携带cookie值来(这一步有浏览器自动完成),我们就能识别到对应...2.Payload:载荷,就是有效数据,在官方文档中(RFC7519),这里给了 7 个示例信息: iss (issuer):表示签发人 exp (expiration time):表示token过期时间...步骤翻译: 应用程序或客户端向授权服务器请求授权 获取到授权后,授权服务器会向应用程序返回访问令牌 应用程序使用访问令牌来访问受保护资源(如API) 因为 JWT 签发的 token 中已经包含了用户的身份信息...注销问题,由于服务端不再保存用户信息,所以一般可以通过修改 secret 来实现注销,服务端 secret 修改后,已经颁发的未过期的 token 就会认证失败,进而实现注销,不过毕竟没有传统的注销方便...密码重置,密码重置后,原本的 token 依然可以访问系统,这时候也需要强制修改 secret。 基于第 2 点和第 3 点,一般建议不同用户取不同 secret。

    2.1K10

    渗透测试逻辑漏洞原理与验证(3)——会话管理问题

    ,比如在删除了某个参数后无法正常访问用户的个人资料,那么这个参数应该与会话令牌有关令牌使用情景发送到用户注册邮箱的密码恢复令牌防止CSRF的会话令牌用于一次性访问受保护资源的令牌未使用验证的购物应用程序的消费者用于检索现有订单状态的令牌会话令牌生成过程中的缺陷令牌有含义我们常规抓取...HTTP协议,用户的会话令牌还是可以通过此泄露在日志中泄露令牌协助网络管理人员的系统日志如果记录了最近的会话日志,且未对访问控制进行严格管理,那么在此种情况下,攻击者可能通过日志获得登录会话如果应用程序将会话置于...,即一个用户令牌发布后不再改变客户端暴露在令牌劫持风险中网站存在如下攻击,容易造成会话令牌被劫持:XSSCSRF会话固定认证前就发布令牌认证后获得的会话令牌可重新用于其他用户认证应用程序接受伪造令牌令牌不失效令牌有效期过长是否需要在一段时间后使令牌失效是否需要在关闭浏览器时使令牌失效令牌尝试次数过多可以考虑在令牌提交次数过多时候使令牌失效无效的令牌重置的手段注销后令牌是否还有效会话管理问题...cookie的属性值expires,就是用于设置cookie过期时间,如果设置一个时间,到期后cookie则失效,如果默认不设置,则为浏览器关闭后cookie失效。...用户注销后,令牌是否有设置失效,如没有该逻辑,那么注销后的令牌仍然合法,攻击者依旧可以以用户身份登录。

    12810

    使用redis记录用户登录状态

    记录用户登录状态的重要性 用户登录状态的管理对于Web应用程序来说至关重要,它可以帮助应用程序实现以下功能: 身份识别与验证: 用户登录状态可以帮助应用程序识别用户的身份,确保只有合法用户可以访问受保护的资源...权限控制: 基于用户登录状态,应用程序可以实现不同用户或用户组的权限控制,确保用户只能访问其有权限的资源和功能。...移动应用程序: 在移动应用中,可以使用Redis记录用户的登录状态,实现用户登录、退出和状态查询等功能。...利用过期时间 在将用户登录状态存储到Redis中时,可以设置合适的过期时间。这样可以确保用户的登录状态在一定时间后自动失效,提高系统的安全性和可靠性。 2....例如,在用户使用密码登录后,还可以要求用户输入动态验证码或使用硬件安全令牌进行身份验证。 2.

    10610

    关于Web验证的几种方法

    只能使用无效的凭据重写凭据来注销用户。 与基本身份验证相比,由于无法使用 bcrypt,因此密码在服务器上的安全性较低。 容易受到中间人攻击。...它们只能过期。这意味着如果令牌泄漏,则攻击者可以滥用令牌直到其到期。因此,将令牌过期时间设置为非常小的值(例如 15 分钟)是非常重要的。 需要设置令牌刷新以在到期时自动发行令牌。...用户在受信任的系统上获取代码,然后将其输入回 Web 应用 服务器使用存储的种子验证代码,确保其未过期,并相应地授予访问权限 谷歌身份验证器、微软身份验证器和 FreeOTP 等 OTP 代理如何工作...,然后在 Web 应用中输入该代码 服务器验证代码并相应地授予访问权限 优点 添加了一层额外的保护 不会有被盗密码在实现 OTP 的多个站点或服务上通过验证的危险 缺点 你需要存储用于生成 OTP 的种子...通过身份验证后,你将被重定向回自动登录的网站。这是使用 OpenID 进行身份验证的示例。它让你可以使用现有帐户(通过一个 OpenID 提供程序)进行身份验证,而无需创建新帐户。

    3.9K30

    分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南

    刷新令牌具有较长的生命周期,用于在原始访问令牌过期后获取新的访问令牌。 当访问令牌过期时,客户端将刷新令牌发送到服务器,然后服务器验证刷新令牌并生成新的访问令牌。...通过使刷新令牌无效,服务器可以阻止用户获取新的访问令牌,从而有效地将他们从系统中注销。 总之,刷新令牌是一个强大的工具,可在您的应用程序中维持无缝且安全的身份验证体验。...JWT(JSON Web 令牌)是一种紧凑、URL 安全的方式,用于表示要在两方之间传输的声明。 在 OAuth 2.0 中,JWT 可以用作访问令牌和/或刷新令牌。...客户端将令牌存储在本地存储中或作为仅 HTTP 的安全 cookie。 客户端在每个访问受保护资源的请求中发送访问令牌。 当访问令牌过期时,客户端将刷新令牌发送到认证服务器以获取新的访问令牌。...总的来说,在身份验证过程中加入刷新令牌可以极大地改善用户体验并提高 Web 应用程序的安全性。通过本指南,您现在应该具备在 JavaScript 应用程序中实现刷新令牌所需的知识和工具。

    36430

    React 应用架构实战 0x6:实现用户认证和全局通知

    目前,当涉及到管理控制台中的用户身份验证时,应用程序仍然依赖于测试数据。在本节中,我们将构建应用程序的身份验证系统,允许用户认证并访问受保护的资源在管理控制台中。...除了响应数据之外,还将附加一个 httpOnly cookie,从此时起用于身份验证请求 每当用户进行身份验证时,我们将从响应中的用户对象存储在 react-query 缓存中,并使其对应用程序可用 由于身份验证是基于...cookie 的,带有 httpOnly cookie,因此我们不需要在前端处理身份验证令牌,任何后续请求都将自动包括令牌 调用 /auth/me 接口将处理页面刷新后的用户数据持久化,该接口将获取用户数据并将其存储在相同的...react-query 缓存中 为了实现此系统,我们需要以下内容: 认证功能(登录、注销和访问已认证用户) 保护需要用户进行身份验证的资源 # 功能实现 # 登录 // src/features/auth...(); }, }); return { submit, isLoading, }; }; 在登出按钮中,我们将使用 useLogout hook 来处理注销请求

    1.6K20

    六种Web身份验证方法比较和Flask示例代码

    它不要求用户在每个请求中提供用户名或密码。相反,在登录后,服务器将验证凭据。如果有效,它将生成一个会话,将其存储在会话存储中,然后将会话 ID 发送回浏览器。...缺点 根据令牌在客户端上的保存方式,它可能导致 XSS(通过 localStorage)或 CSRF(通过 cookie)攻击。 无法删除令牌。它们只能过期。...生成后,它们将在一段时间后过期。 由于您可以获得额外的安全层,因此建议将OTP用于涉及高度敏感数据的应用程序,例如网上银行和其他金融服务。...,并相应地授予访问权限 TOTP的工作原理: 客户端发送用户名和密码 凭据验证后,服务器使用随机生成的种子生成随机代码,将种子存储在服务器端,并将代码发送到受信任的系统 用户在受信任的系统上获取代码,然后将其输入回...在已配置的 OpenID 提供程序上没有帐户的用户将无法访问您的应用程序。最好的方法是同时实现两者 - 例如,用户名和密码以及OpenID - 并让用户选择。 包 想要实施社交登录?

    7.5K40

    微服务架构下的安全认证与鉴权

    在请求时,网关将原始用户令牌转换为内部会话 ID 令牌。在这种情况下,注销就不是问题,因为网关可以在注销时撤销用户的令牌。...一般有如下几种方式: Token 存储在 Cookie 中,这样客户端注销时,自然可以清空掉 注销时,将 Token 存放到分布式缓存中,每次校验 Token 时区检查下该 Token 是否已注销。...多采用短期令牌,比如令牌有效期是 20 分钟,这样可以一定程度上降低注销后 Token 可用性的风险。...客户端将用户名和密码发给认证服务器,向后者请求令牌。 认证服务器确认无误后,向客户端提供访问令牌。 4....认证服务器确认无误后,向客户端提供访问令牌。

    3.6K60
    领券