Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用OAuth2和PassportJS获取Google Fitness API数据_Node.js_Express_Passport.js_Google Oauth_Google Fit - Fatal编程技术网

Node.js 如何使用OAuth2和PassportJS获取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&

我在使用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>', 
    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
写入
是查看和存储