Как получить данные Google Fitness API, используя OAuth2 с PassportJS - PullRequest
1 голос
/ 11 октября 2019

У меня проблемы с получением данных из Google Fitness API для использования в моем приложении с использованием Node и Express. Вот часть 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);
});

Как вы видите, я запрашиваю 2 разных области видимости. Вот моя стратегия с использованием passport-google-oauth20 Вот моя стратегия для конкретных точек данных passport.js:

passport.use(
    new GoogleStrategy({
        clientID: keys.google.clientID,
        clientSecret: keys.google.clientSecret,
        callbackURL:'<callback url>'
    }, (accessToken, refreshToken, profile, done) => {
            console.log(profile);
        } 
    )
)

Однако проблема в том, что в консоли я получаю только первую область "profile" со всемиего свойства, но нет информации, связанной с фитнесом. Есть идеи, что с ним не так? Должен ли я использовать другую стратегию реализации? На данный момент этот код зависает при входе в Google, и консоль регистрирует информацию о профиле, которая является нормальной.

Есть идеи? Спасибо.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Я понял это благодаря комментарию @griFlo. После того, как я получил токен доступа из процесса аутентификации, мне пришлось использовать это и все, что было сгенерировано, для вызова API, который я хотел, что я и сделал, используя обещание запроса из модуля request-promise внутри стратегии.

Сначала установите модуль, используя 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);
                      });  
                    });
                } 
        });
}));

Важная часть находится в части обещания mongoose, где вы проверяете пользователя перед вызовом API, чтобы вы могли добавить извлеченные данные в предопределенную схему и сохранить ее. .

0 голосов
/ 11 октября 2019

Правильный объем: fitness.activity.read

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...