- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的 axios 响应中有以下拦截器:
window.axios.interceptors.response.use(
response => {
return response;
},
error => {
let errorResponse = error.response;
if (errorResponse.status === 401 && errorResponse.config && !errorResponse.config.__isRetryRequest) {
return this._getAuthToken()
.then(response => {
this.setToken(response.data.access_token, response.data.refresh_token);
errorResponse.config.__isRetryRequest = true;
errorResponse.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;
return window.axios(errorResponse.config);
}).catch(error => {
return Promise.reject(error);
});
}
return Promise.reject(error);
}
);
_getAuthToken 方法是:
_getAuthToken() {
if (!this.authTokenRequest) {
this.authTokenRequest = window.axios.post('/api/refresh_token', {
'refresh_token': localStorage.getItem('refresh_token')
});
this.authTokenRequest.then(response => {
this.authTokenRequest = null;
}).catch(error => {
this.authTokenRequest = null;
});
}
return this.authTokenRequest;
}
该代码很大程度上受到 https://github.com/axios/axios/issues/266#issuecomment-335420598 的启发。 .
总结:当用户调用 API 并且他的 access_token 已过期(API 返回 401 代码)时,应用程序调用/api/refresh_token 端点以获取新的 access_token。如果在进行此调用时 refresh_token 仍然有效,则一切正常:我获得了一个新的 access_token 和一个新的 refresh_token,并且再次进行了用户请求的初始 API 调用并正确返回。
问题出现在refresh_token也过期的时候。
在这种情况下,对/api/refresh_token 的调用会返回 401 并且什么也不会发生。我尝试了几件事,但无法检测到,无法将用户重定向到应用程序的登录页面。
我发现在那种情况下,_getAuthToken 方法中的 if (!this.authTokenRequest) 语句返回一个从 Unresolved 未决 Promise。我不明白为什么这是一个 promise 。在我看来它应该是空的......
我是 Promises 的新手,所以我可能会遗漏一些东西!感谢您的帮助!
编辑:
我可能找到了一种更简单的方法来处理这个问题:当我调用/api/refresh_token 端点时使用 axios.interceptors.response.eject() 禁用拦截器,然后重新启用它。
代码:
createAxiosResponseInterceptor() {
this.axiosResponseInterceptor = window.axios.interceptors.response.use(
response => {
return response;
},
error => {
let errorResponse = error.response;
if (errorResponse.status === 401) {
window.axios.interceptors.response.eject(this.axiosResponseInterceptor);
return window.axios.post('/api/refresh_token', {
'refresh_token': this._getToken('refresh_token')
}).then(response => {
this.setToken(response.data.access_token, response.data.refresh_token);
errorResponse.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;
this.createAxiosResponseInterceptor();
return window.axios(errorResponse.config);
}).catch(error => {
this.destroyToken();
this.createAxiosResponseInterceptor();
this.router.push('/login');
return Promise.reject(error);
});
}
return Promise.reject(error);
}
);
},
看起来好还是不好?任何建议或评论表示赞赏。
最佳答案
你最后的解决方案看起来不错。如果我处于相同的情况,我会想出与您类似的实现方式。
I found that in that case the if (!this.authTokenRequest) statement inside the _getAuthToken method returns a pending Promise that is never resolved. I don't understand why this is a Promise. In my opinion it should be null...
那是因为代码中的this.authTokenRequest
只是分配了从window.axios.post
创建的Promise。 Promise 是一种处理延迟评估的对象,因此您在 then
中实现的过程在 Promise 被解决之前不会执行。
JavaScript 为我们提供了 Promise 对象作为一种异步事件处理程序,使我们能够将流程实现为 then
链,该链将执行以响应异步结果的结果。 HTTP 请求总是不可预测的,因为 HTTP 请求有时会消耗我们预期的更多时间,有时也不会。当我们使用 HTTP 请求时总是使用 Promise,以便使用事件处理程序处理它的异步响应。
在 ES2015 语法中,您可以使用 async/await 语法实现函数来处理 Promise 对象,因为它看起来是同步的。
关于laravel - Axios 响应拦截器 : unable to handle an expired refresh_token (401),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48100834/
我的 Twilio 可编程视频控制台定期收到此警告。它似乎并没有影响我的视频 session ,但是因为,好吧,我有点强制症,我想知道如何让这个警告消失。 在房间进行时是否有规定的刷新 token 的
在 stackoverflow 中搜索后,我了解了如何使用 session 过期。感谢计算器! 代码是: session_start();// Starting Session // Storing
我正在尝试遵循 aws s3 cp 的 AWS 文档, 其中 documents the --expires flag作为: --expires (string) The date and time
我正在尝试缓存控制所有静态 css/js 文件。代码看起来像: @Override public void addResourceHandlers(ResourceHandlerRegis
我正在使用 Spring Security 3.0.2 基于表单的身份验证。但我不知道如何配置它,以便在 session 过期时请求不会重定向到其他页面(过期 url)或显示“ session 过期”
我对基于 token 的授权相当陌生。我正在尝试找出自定义过期/ token 刷新方案中的缺陷。 我在 Express API 中有一个基本的 JWT 身份验证设置;我将 JWT 过期时间设置为 1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
在 android 应用程序中,当使用 DefaultHttpClient 获取 URL 内容(执行 HttpGet)时,我在日志中收到以下警告: W/ResponseProcessCookies(2
这与 DST Root CA X3 Expiration (September 2021) 有关 当在线搜索修复程序以应用于旧服务器(在我的情况下为 Debian 8)时,该服务器确实调用了使用 le
我很难弄明白这一点。我想在 paypal 中创建一个永远不会结束的月度订阅,除非用户取消它。每次订阅运行时,我都希望它调用我的 IPN url。 下面是我正在使用的: 请注意,我删除了 IPN ur
对于下面的 block ,生命周期'b和'c什么时候结束? use core::ops::Deref; #[derive(Debug)] struct A { child_b: &'b T,
我正在尝试为我的网站设置 cookie。我正在使用: ServletActionContext.getResponse().addCookie(); Cookie maxAge 设置为“2592000
我正在尝试编写一个 HOC,在一段时间后将其状态属性 visible 更改为 false。 这是我到目前为止所得到的: const withExpire = (WrappedComponent) =>
在我的 WordPress 网站上,我有数千个过期交易的帖子。它们都属于已存档类别。我正在寻找一个 Mysql 查询或 php 程序,它将在所有标题(存档帖子)前面插入字符串“EXPIRED”。我很感
我为 HTML 和 CSS 制作了一个日历,但我没有足够的 JS(或 jQuery),所以在一定时间后,日期会变得不活动。所有不活动的按钮(带日期)都有“过期”类,我有必要在每天过期后,将“过期”类添
我正在使用 tymondesigns/jwt-auth我的应用程序包,但一段时间后显示 token expired 消息。我已经设置了 'ttl' => null 并删除了 exp 但它没有用。 这是
我正在使用 axios 向 diro 发送请求使用端点 /user/create 创建用户. 但是,我不断收到这样的错误: Error response: { Error: certificate h
尝试使用 Mechanize 从 https asp 站点上抓取一些内容,看起来好像登录页面提交有效,因为我返回了 200。但是当我尝试打开一个可能使用登录后捕获的 cookie 的 url 时,我重
我正在使用以下命令创建 keystore : keytool -genkey -keystore myStore.keystore -keyalg RSA -keysize 1024 -alias m
使用这行代码时,我不断收到错误消息,我试图让 cookie“myCookie”在凌晨 12:00 过期。 但我不确定为什么我无法做到这一点。 这些是错误: 如果我用这个, Response.Cooki
我是一名优秀的程序员,十分优秀!