我正在开发一个使用fitbit apis的快速api服务器。 https://dev.fitbit.com/build/reference/web-api/oauth2/
我在令牌过期时遇到问题,我需要刷新它。 我的尝试是在发出任何请求之前刷新令牌,然后更新令牌。
这种方法运行良好一段时间,但现在我收到一条消息,说令牌已过期,显然它没有刷新它。
这是我的代码的简化版本:
const express = require('express');
const app = express();
const request = require('request');
var fitbitConfig = {
tokens: {
basic: 'MjJDU...',
refresh: 'f6b740cf...',
}
};
// While developing, this allows all access type
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
function refreshTokens(){
return new Promise(function(resolve, reject){
request(
{
method: 'POST',
url: `https://api.fitbit.com/oauth2/token`,
headers: { Authorization: `Basic ${fitbitConfig.tokens.basic}` },
form: {
grant_type: 'refresh_token',
refresh_token: fitbitConfig.tokens.refresh
}
},
function (err, response, body) {
if (err) {
console.log(`error is : ${err}`);
reject(err)
}
response.body = JSON.parse(response.body);
fitbitConfig.tokens.refresh = response.body.refresh_token;
fitbitConfig.tokens.access = response.body.access_token;
resolve(fitbitConfig.tokens);
}
)
})
}
function getRequest(url, token, params){
return new Promise(function(resolve, reject){
request.get({
headers: { Authorization: `Bearer ${token}` },
url: url
}, (err, response, body) => {
if (err) {
console.log(`error is : ${err}`);
reject(err)
}
resolve(response)
})
})
}
app.get('/get/profile', function(req, res) {
refreshTokens().then((tokens) => {
getRequest('https://api.fitbit.com/1/user/-/profile.json', tokens.access).then((response) => {res.send(response)})
});
});
var port = process.env.PORT || 3000;
app.listen(port);
console.log('Listening on port ' + port);
为什么这会在一段时间后失败?根据我的理解,每当我得到一个新的refresh_token(所以基本上在每个请求之前),这将被存储并且创建一个全新的访问令牌(应该持续1小时)。
如果小时到期,请再次在请求之前再生成一个新令牌,该令牌会在一小时后到期等等。
假设这个我错了吗?
此外,这是我第一次尝试使用express,更重要的是使用这样的api界面进行开发,所以请耐心等待。
Aso值得指出,当令牌未到期时,一切都像魅力一样。
由于