Node.js 如何使用OAuth2和PassportJS获取Google Fitness API数据
我在使用Node和Express从Google Fitness API获取数据以用于我的应用程序时遇到问题。下面是Node.js 如何使用OAuth2和PassportJS获取Google Fitness API数据,node.js,express,passport.js,google-oauth,google-fit,Node.js,Express,Passport.js,Google Oauth,Google Fit,我在使用Node和Express从Google Fitness API获取数据以用于我的应用程序时遇到问题。下面是app.js的一部分: app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'https://www.googleapis.com/auth/fitness.activity.write'] } )); app.get('<callback url&
app.js
的一部分:
app.get('/auth/google',
passport.authenticate('google',
{ scope: ['profile', 'https://www.googleapis.com/auth/fitness.activity.write'] }
));
app.get('<callback url>',
passport.authenticate('google'), (req, res) => {
res.json(req.user);
});
passport.use(
new GoogleStrategy({
clientID: keys.google.clientID,
clientSecret: keys.google.clientSecret,
callbackURL:'<callback url>'
}, (accessToken, refreshToken, profile, done) => {
console.log(profile);
}
)
)
然而,问题是,在控制台中,我只获得第一个作用域“profile”
及其所有属性,但没有与健身相关的信息。知道有什么问题吗?我应该使用不同的战略实施吗?目前,这段代码挂起到谷歌的登录,控制台记录个人资料信息,这是正常的
有什么想法吗?谢谢。正确的范围是:
fitness.activity.read
多亏了@griFlo
的评论,我才明白了这一点。一旦我从身份验证过程中获得了访问令牌,我就必须使用此令牌和生成的其他令牌来调用我想要的api,这是我使用策略中请求承诺
模块中的请求承诺实现的
首先使用npm i request promise安装模块,并要求将模块安装到应用程序的上部。代码应该如下所示:
//other defines
...
const request = require('request-promise');
passport.use(
new GoogleStrategy({
// options for google strategy
clientID: keys.google.clientID,
clientSecret: keys.google.clientSecret,
callbackURL:'<callback url>'
}, (accessToken, refreshToken, profile, done) => {
User.findOne({googleId: profile.id}).then((currentUser) => {
if (currentUser){
// check user
done(null, currentUser);
} else {
//call fitness api
url = keys.google.fitnessUrl;
request.get(url).auth(null, null, true, accessToken)
.then(res=> {
new User({
googleId: profile.id,
....
activity: res
}
).save().then((newUser) => {
done(null, newUser);
});
});
}
});
}));
//其他定义
...
const request=require(“请求-承诺”);
passport.use(
谷歌新战略({
//谷歌战略的选择
clientID:keys.google.clientID,
clientSecret:keys.google.clientSecret,
回调URL:“”
},(accessToken、refreshToken、配置文件、完成)=>{
User.findOne({googleId:profile.id})。然后((currentUser)=>{
如果(当前用户){
//检查用户
完成(空,当前用户);
}否则{
//调用健身api
url=keys.google.fitnessUrl;
request.get(url.auth)(null,null,true,accessToken)
。然后(res=>{
新用户({
googleId:profile.id,
....
活动:res
}
).save().then((newUser)=>{
完成(null,newUser);
});
});
}
});
}));
重要的部分在mongoose promise部分中,您可以在调用api之前检查用户,以便将获取的数据添加到预定义的模式中并保存。如果我错了,请有人纠正我,但您现在是否可以使用请求的accessToken调用fitness api?(
https://www.googleapis.com/fitness/v1/users/me/dataSources
)请参阅:https://developers.google.com/fit/rest/v1/get-started
写入
是查看和存储