我有一个带节点的应用程序,我的应用程序在API上使用JWT进行了身份验证(作为客户端)。
当我遇到401错误时,如何刷新令牌?
我的项目不使用Express
我的服务:
const request = require('request');
let config = require('../../configuration');
module.exports = {
get_movies: function () {
return new Promise((resolve, reject) => {
request({
method: 'GET',
uri : 'http://myapi/v1/movies',
auth : {
'bearer': config.token
},
json : true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
resolve(body);
} else {
reject(response);
}
})
});
},
...
refreshToken: function () {
return new Promise((resolve, reject) => {
request({
method: 'GET',
uri : 'http://myapi/v1/token-refresh',
auth : {
'bearer': config.token
},
json : true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
resolve(body);
} else {
reject(response);
}
})
});
};
我想知道是否可以在我的get_movies函数上拦截我的(错误401)请求,例如,调用我的刷新令牌函数并在重试之前的函数(get_movies)之后?
答案 0 :(得分:0)
一种简单的方法是在get_movies
承诺之后放置一个错误处理程序来处理案例并重试。沿着:
get_retry: function () {
return get_movies().catch((rejection) => {
if (rejection.statusCode === 401)
return refreshToken().then((x) => get_retry())
})
}
如果refreshToken()
有可能无法修复HTTP 401
,请注意无限循环的可能性。
答案 1 :(得分:0)
我一直在为此使用 got 并且对此非常满意。
您可以使用 let response = {
statusCode: responseCode,
headers: {
"x-custom-header" : "my custom header value",
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify(responseBody)
};
console.log("response: " + JSON.stringify(response))
return response;
钩子检测错误,检查是否为 401,然后刷新令牌并重新提交原始请求。
来自文档:
afterResponse
到目前为止它对我来说很好:-)