Jawbone API OAuth access_token 使用 node.js 处理(快递和护照)
Jawbone API OAuth access_token handling with node.js (express & passport)
有没有人成功导航 Jawbone's OAuth2.0 authentication 的 REST API?
我不知道如何访问和发送 authorization_code
以获得 access_token
(Jawbone API Authorization Documentation 中的第 4 步和第 5 步)。我想为后续(AJAX 样式)调用重用 access_token
,并避免每次都要求用户重新授权。
API (get.sleeps
) 的每次调用都需要完整的身份验证过程往返,包括此重新授权以获得 authorization_token
(屏幕截图)。 Jawbone 和 Passport 文档在这一点上都含糊不清。
我的堆栈涉及 node.js
、jawbone-up
NPM、express.js
和 passport.js
。当我取回有效数据时,Jawbone 的 Passport Strategy 似乎可以正常工作。
jawbone-up
NPM 明确地不帮助维护会话 (access_token
),说 "This library does not assist in getting an access_token through OAuth..."
问题:如何在 API 调用中实际使用 OAUTH access_token
?谁能告诉我一些代码来做到这一点?
谢谢
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);
});
Jawbone 访问令牌在 1 年 后到期,因此您绝对不需要每次都重新验证用户。此外,您还获得了 refresh_token
,因此您可以在需要时刷新访问令牌。
一旦你有了 access_token
,你必须将它存储在某个地方,最好是某种数据库或文件存储中以备后用,然后你为每个向 Jawbone REST 发出的请求使用该令牌API.
jawbone-up 模块在内部使用 request,所以我将向您展示如何使用它发出请求(它应该差不多是与任何其他模块相同)。
以下是获取用户个人资料的方法(最基本的 API 调用):
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
})
还有另一个名为 Purest 的模块,它也在内部使用 request,但隐藏了使用 REST API 的一些复杂性。以下是使用该模块时相同请求的样子:
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
),您可以使用另一个名为 Grant 的模块,我个人使用它,但任何一个都应该工作。
你离得不远,你已经拿到令牌了。要使您的代码正常工作,需要几个步骤:
添加一个"session"的概念,作为全局变量从一个请求到另一个请求存在的数据。当你做一个完整的网络应用程序时,使用 express-sessions 和 passport-sessions 并实施用户管理。但是现在我们只是为单个用户状态添加一个全局。
var demoSession = {
accessToken: '',
refreshToken: ''
};
在JawboneStrategy 的done() 中传入一个用户对象。这是因为护照的 "authorize" 功能期望用户存在于会话中。它将授权结果附加到该用户。由于我们只是在测试 API 只是传入一个空用户。
// 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”。添加路由,将认证与服务显示分开。
app.get('/done', passport.authorize('jawbone', {
scope: ['basic_read','sleep_read'],
failureRedirect: '/'
}), function(req, res) {
res.redirect('/data');
}
);
最后,Jawbone Up 睡眠 API 有点棘手。您必须在请求中添加 YYYYMMDD 字符串:
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
有没有人成功导航 Jawbone's OAuth2.0 authentication 的 REST API?
我不知道如何访问和发送 authorization_code
以获得 access_token
(Jawbone API Authorization Documentation 中的第 4 步和第 5 步)。我想为后续(AJAX 样式)调用重用 access_token
,并避免每次都要求用户重新授权。
API (get.sleeps
) 的每次调用都需要完整的身份验证过程往返,包括此重新授权以获得 authorization_token
(屏幕截图)。 Jawbone 和 Passport 文档在这一点上都含糊不清。
我的堆栈涉及 node.js
、jawbone-up
NPM、express.js
和 passport.js
。当我取回有效数据时,Jawbone 的 Passport Strategy 似乎可以正常工作。
jawbone-up
NPM 明确地不帮助维护会话 (access_token
),说 "This library does not assist in getting an access_token through OAuth..."
问题:如何在 API 调用中实际使用 OAUTH access_token
?谁能告诉我一些代码来做到这一点?
谢谢
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);
});
Jawbone 访问令牌在 1 年 后到期,因此您绝对不需要每次都重新验证用户。此外,您还获得了 refresh_token
,因此您可以在需要时刷新访问令牌。
一旦你有了 access_token
,你必须将它存储在某个地方,最好是某种数据库或文件存储中以备后用,然后你为每个向 Jawbone REST 发出的请求使用该令牌API.
jawbone-up 模块在内部使用 request,所以我将向您展示如何使用它发出请求(它应该差不多是与任何其他模块相同)。
以下是获取用户个人资料的方法(最基本的 API 调用):
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
})
还有另一个名为 Purest 的模块,它也在内部使用 request,但隐藏了使用 REST API 的一些复杂性。以下是使用该模块时相同请求的样子:
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
),您可以使用另一个名为 Grant 的模块,我个人使用它,但任何一个都应该工作。
你离得不远,你已经拿到令牌了。要使您的代码正常工作,需要几个步骤:
添加一个"session"的概念,作为全局变量从一个请求到另一个请求存在的数据。当你做一个完整的网络应用程序时,使用 express-sessions 和 passport-sessions 并实施用户管理。但是现在我们只是为单个用户状态添加一个全局。
var demoSession = {
accessToken: '',
refreshToken: ''
};
在JawboneStrategy 的done() 中传入一个用户对象。这是因为护照的 "authorize" 功能期望用户存在于会话中。它将授权结果附加到该用户。由于我们只是在测试 API 只是传入一个空用户。
// 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”。添加路由,将认证与服务显示分开。
app.get('/done', passport.authorize('jawbone', {
scope: ['basic_read','sleep_read'],
failureRedirect: '/'
}), function(req, res) {
res.redirect('/data');
}
);
最后,Jawbone Up 睡眠 API 有点棘手。您必须在请求中添加 YYYYMMDD 字符串:
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