如何刷新jwt并重新发送失败的http请求
How to refresh jwt and resend failed http request?
我有一个带有jwt授权的后端,我想处理过期的令牌。
需要以下流程:
- 发出带有令牌的请求(并期望得到承诺)
- 如果运行正常,则返回promise(调用者的then/fail方法被执行)
- 如果失败(401未授权),则发出刷新令牌的请求,令牌在本地更新
- 如果步骤3成功,返回原始请求的承诺
- 如果步骤3使用401失败(令牌无法刷新),错误重定向到登录页面
问题:在步骤4中,原始函数被调用(再次),但是调用者的then/fail方法没有被触发。
下面是我的方法来附加jwt令牌到url并发送http请求:
var AuthenticatedRequest = function(url, data, method) {
return (function tryRequest(){
console.log('calling tryRequest');
return reqwest({
url: ApiUtil.tokenUrlTo(url),
method: method,
crossOrigin: true,
type: 'json',
data: data
})
.fail(function(err) {
if (err.status === 401) {
return post('/auth/refresh-token')
.then(function(response){
console.log('assume token set');
//code to update token locally
})
.then(tryRequest)
.fail(function(err){
// Can't refresh token. Send to login page
})
;
}
})
;
})();
};
来电者:
fetchModules: function() {
get('/admin/modules')
.then(function(response) {
Actions.modulesFetchSuccess(response.collection);
})
.fail(function(err) {
Actions.modulesFetchError(ApiUtil.errorArrayForResponse(err));
})
;
},
现在,如果我因为令牌过期而获得401,我触发一个新的周期来刷新令牌,如这个问题中所建议的,在失败后重新启动一个承诺。
注意:post
和get
函数只是AuthenticatedRequest
函数的包装,方法设置为POST
或GET
。
AuthenticatedRequest
函数返回一个承诺,如果令牌没有过期,则运行正常,然而,当令牌过期时,我在控制台中得到一个错误,并获取新的令牌,并再次调用该函数,我的控制台的屏幕截图- https://i.stack.imgur.com/hJdId.png
但是fetchModules
的then
方法在令牌更新后不会被触发。我做错了什么?
可能的副本:
- AngularJS -处理刷新令牌?
- 如何在未被授权时重新发送请求
- 承诺失败后重新启动
2015年9月13日更新
@Bergi的答案工作时,我取代了reqwest.js
和使用q.js
香草ajax显示在这个要点
问题是.fail
总是捕获您的错误,而不仅仅是第一次。对tryRequest
的递归调用将包括重试本身,并且永远不会返回失败的承诺。
如果只需要一次重试,则需要将其放在外部:
function AuthenticatedRequest(url, data, method) {
function tryRequest() {
console.log('calling tryRequest');
return reqwest({
url: ApiUtil.tokenUrlTo(url),
method: method,
crossOrigin: true,
type: 'json',
data: data
});
}
return tryRequest().fail(function(err) {
if (err.status !== 401) throw err;
return post('/auth/refresh-token')
.then(function(response) {
console.log('assume token set');
// code to update token locally
})
.then(tryRequest)
.fail(function(err) {
// Can't refresh token. Send to login page
});
});
}
请注意,从AuthenticatedRequest
函数将用户发送到另一个页面可能不是一个好的设计,也许可以考虑重新抛出错误(在令牌无效之后?),并将重定向和所有内容放在调用者的错误处理程序中。
相关文章:
- Jquery Onclick将数据发送到新打开的窗口
- javascript:发送带有音频文件的POST,然后重定向到新页面
- 使用ajax发送rowID并将选定的行附加到新表中
- 剑道网格-插入具有外部列的新对象失败
- NodeJS Fork-每次子流程发送新行时都进行React
- 为什么当我使用初始化触发器函数时,我总是找不到脚本函数:发送发票如果新
- 更新购物车.我想发送以前的数量和新数量
- Facebook Messenger,发送收据时临时发送消息失败
- 如何在发送时不打开新页面的情况下使用php/ajax发送表单
- 发送新信息时向下滚动到底部
- 新的gump ruby sass alpha任务失败
- 错误:“;发送电子邮件失败:没有收件人"
- JavaScript XMLHttpRequest发送失败
- 如何重新发送失败的ajax请求
- Javascript函数创建新对象失败
- 创建新对象失败,错误代码:没有找到用于更新/删除的对象
- 如何刷新jwt并重新发送失败的http请求
- 检测何时邮件发送失败
- 这个表单提示“发送失败”
- Webrtc向c++原生api发送新报价时,重新协商失败