首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jawbone access_token处理node.js (特快专递和护照)

Jawbone access_token处理node.js (特快专递和护照)
EN

Stack Overflow用户
提问于 2015-07-13 15:32:18
回答 2查看 440关注 0票数 0

是否有人成功地为REST导航了Jawbone的OAuth2.0认证

我无法弄清楚如何访问和发送authorization_code以获得access_token (Jawbone授权文档中的步骤4和5)。我希望在后续(AJAX风格)调用中重用access_token,并避免每次都要求用户重新授权。

API (get.sleeps)的每个调用都需要一个完整的auth进程往返过程,包括获得一个authorization_token (屏幕快照)的重新授权。Jawbone和护照文档在这一点上都很模糊。

我的堆栈包括,node.jsNPMexpress.jspassport.js。当我获得有效数据时,Jawbone的护照策略看起来是正确的。

jawbone-up NPM显式地没有帮助维护会话(access_token),它说“这个库不帮助通过OAuth获得access_token .”

问:我如何在API调用中实际使用OAUTH access_token?有人能给我看看代码吗?

谢谢

代码语言:javascript
复制
var dotenv = require('dotenv').load(),
    express = require('express'),
    app = express(),
    ejs = require('ejs'),
    https = require('https'),
    fs = require('fs'),
    bodyParser = require('body-parser'),
    passport = require('passport'),
    JawboneStrategy = require('passport-oauth').OAuth2Strategy,
    port = 5000,
    jawboneAuth = {
       clientID: process.env.JAWBONE_CLIENT_ID,
       clientSecret: process.env.JAWBONE_CLIENT_SECRET,
       authorizationURL: process.env.JAWBONE_AUTH_URL,
       tokenURL: process.env.JAWBONE_AUTH_TOKEN_URL,
       callbackURL: process.env.JAWBONE_CALLBACK_URL 
    },
    sslOptions = {
        key: fs.readFileSync('./server.key'),
        cert: fs.readFileSync('./server.crt')
    };
    app.use(bodyParser.json());
    app.use(express.static(__dirname + '/public'));
    app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views');

// ----- Passport set up ----- //
app.use(passport.initialize());

app.get('/', 
    passport.authorize('jawbone', {
        scope: ['basic_read','sleep_read'],
        failureRedirect: '/'
    })
);

app.get('/done',
    passport.authorize('jawbone', {
        scope: ['basic_read','sleep_read'],
        failureRedirect: '/'
    }), function(req, res) {
        res.render('userdata', req.account);
    }
);

passport.use('jawbone', new JawboneStrategy({
    clientID: jawboneAuth.clientID,
    clientSecret: jawboneAuth.clientSecret,
    authorizationURL: jawboneAuth.authorizationURL,
    tokenURL: jawboneAuth.tokenURL,
    callbackURL: jawboneAuth.callbackURL
}, function(token, refreshToken, profile, done) {
    var options = {
            access_token: token,
            client_id: jawboneAuth.clientID,
            client_secret: jawboneAuth.clientSecret
        },
        up = require('jawbone-up')(options);

    up.sleeps.get({}, function(err, body) {
        if (err) {
            console.log('Error receiving Jawbone UP data');
        } else {
        var jawboneData = JSON.parse(body).data;
        console.log(jawboneData);
        return done(null, jawboneData, console.log('Jawbone UP data ready to be displayed.'));
        }
    });
}));
// HTTPS
var secureServer = https.createServer(sslOptions, app).listen(port, function(){
    console.log('UP server listening on ' + port);
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-18 18:50:09

你离得不太远,你已经拿到钱了。要使代码工作,需要执行几个步骤:

添加“会话”的概念,即从请求到请求的数据作为全局变量存在。当你做一个完整的web应用程序时,使用快速会话和护照会话,并实现用户管理。但就目前而言,我们只是为单个用户状态添加一个全局状态。

代码语言:javascript
复制
var demoSession = {
    accessToken: '',
    refreshToken: ''
};

在JawboneStrategy的done()中传入一个用户对象。这是因为护照的“授权”功能是期望会话中存在一个用户。它将授权结果附加到该用户。因为我们只是在测试API,所以只需要传入一个空用户。

代码语言:javascript
复制
// Setup the passport jawbone authorization strategy
passport.use('jawbone', new JawboneStrategy({
    clientID: jawboneAuth.clientID,
    clientSecret: jawboneAuth.clientSecret,
    authorizationURL: jawboneAuth.authorizationURL,
    tokenURL: jawboneAuth.tokenURL,
    callbackURL: jawboneAuth.callbackURL
}, function(accessToken, refreshToken, profile, done) {
    // we got the access token, store it in our temp session
    demoSession.accessToken = accessToken;
    demoSession.refreshToken = refreshToken;
    var user = {}; // <-- need empty user
    done(null, user);
    console.dir(demoSession);
}));

使用一个特殊的页面显示数据"/data“。添加一条路由,将auth与服务显示分开。

代码语言:javascript
复制
app.get('/done', passport.authorize('jawbone', {
        scope: ['basic_read','sleep_read'],
        failureRedirect: '/'
    }), function(req, res) {
        res.redirect('/data');
    }
);

最后,Jawbone Up睡眠API有点棘手。您必须向请求中添加一个YYYYMMDD字符串:

代码语言:javascript
复制
app.get('/data', function(req, res) {

    var options = {
        access_token: demoSession.accessToken,
        client_id: jawboneAuth.clientID,
        client_secret: jawboneAuth.clientSecret
    };
    var up = require('jawbone-up')(options);

    // we need to add date or sleep call fails
    var yyyymmdd = (new Date()).toISOString().slice(0, 10).replace(/-/g, "");
    console.log('Getting sleep for day ' + yyyymmdd);

    up.sleeps.get({date:yyyymmdd}, function(err, body) {
        if (err) {
            console.log('Error receiving Jawbone UP data');
        } else {
            try {
                var result = JSON.parse(body);
                console.log(result);
                res.render('userdata', {
                    requestTime: result.meta.time,
                    jawboneData: JSON.stringify(result.data)
                });
            }
            catch(err) {
                res.render('userdata', {
                    requestTime: 0,
                    jawboneData: 'Unknown result'
                });
            }

        }
    });
});

我在这里创建了一个适用于我的基本原则,它基于您的代码:https://gist.github.com/longplay/65056061b68f730f1421

票数 0
EN

Stack Overflow用户

发布于 2015-07-18 14:44:54

Jawbone访问令牌在一年内到期,因此您肯定不需要每次都重新验证用户身份。此外,还为您提供了一个refresh_token,因此您可以在需要时刷新访问令牌。

一旦您拥有了access_token,您就必须将它存储在某个地方,最好是存储在某种数据库或文件存储中,以便以后使用,然后对向Jawbone提出的每个请求使用该令牌。

jawbone-up模块在内部使用请求,因此我将向您展示如何使用它发出请求(它应该与任何其他模块基本相同)。

下面是如何获取用户的配置文件(最基本的API调用):

代码语言:javascript
复制
var request = require('request')
request.get({
  uri:'https://jawbone.com/nudge/api/v.1.1/users/@me',
  auth:{bearer:'[ACCESS_TOKEN]'},
  json:true
}, function (err, res, body) {
  // body is a parsed JSON object containing the response data
})

还有一个名为最纯净的模块,它也在内部使用请求,但它隐藏了使用REST的一些复杂性。下面是使用该模块的相同请求的外观:

代码语言:javascript
复制
var Purest = require('purest')
var jawbone = new Purest({provider:'jawbone'})
jawbone.get('users/@me', {
  auth:{bearer:'[ACCESS_TOKEN]'}
}, function (err, res, body) {
  // body is a parsed JSON object containing the response data
})

或者,为了对用户进行身份验证(获取access_token),您可以使用我个人使用的另一个名为格兰特的模块,但这两个模块都应该可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31387507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档