授权代码流程 - 快速刷新令牌

时间:2018-03-07 09:22:59

标签: node.js express token fitbit refresh-token

我正在开发一个使用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值得指出,当令牌未到期时,一切都像魅力一样。

由于

0 个答案:

没有答案