Паспорт - Node.js не возвращается Обновить токен

Я пытаюсь вернуть refreshToken, используя модуль паспорта node.js. Однако я использую приведенный ниже код, и я не могу зарегистрировать токен обновления, но токен доступа работает нормально. Есть ли способ указать тип доступа в автономном режиме для этого модуля, чтобы, надеюсь, вернуть это?

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
 passport.use(new GoogleStrategy({
 clientID: GOOGLE_CLIENT_ID,
 clientSecret: GOOGLE_CLIENT_SECRET,
 callbackURL: "http://myurl/auth/callback"
 },
 function(accessToken, refreshToken, profile, done) {                                                            
  console.log(refreshToken);
  process.nextTick(function () {
      return done(null, [{token:accessToken}, {rToken:refreshToken}, {profile:profile}]);
  });
}
));

Это возвращает refreshToken как undefined.

Любая помощь будет принята с благодарностью.

Ответы

Ответ 1

Это было решено по этой ссылке:

https://github.com/jaredhanson/passport/issues/42

а именно:

passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile',
                                      'https://www.googleapis.com/auth/userinfo.email'],
                                      accessType: 'offline', approvalPrompt: 'force' });

Джаред Хансон - благослови вас.

Ответ 2

Все, что вам нужно, это accessType: 'offline', и вы получите refreshToken при первом входе в систему.

Вам не нужно approvalPrompt или prompt в запросе.

Примечание это работает только при первом входе в систему, если вы не занимаетесь захватом и сохранением refreshToken и не связываете его с учетной записью пользователя при первом входе в систему, вы не можете легко получить это снова.

Если вы не захватили его при первом входе в систему, у вас есть два варианта:

  • Если пользователь входит в систему и у вас нет refreshToken для них, вы можете сразу же вывести их из системы и сообщить им, чтобы они перешли на https://myaccount.google.com/permissions и отмените доступ к вашему приложению, а затем просто войдите снова.

    Когда они снова войдут в систему, они получат одно и то же приглашение для доступа, которое они получили при первом входе в систему, и вы получите refreshToken при первом входе в систему. Просто не забудьте использовать метод в своем обратном вызове в Паспорте, чтобы сохранить refreshToken в свой профиль пользователя в своей базе данных.

    Затем вы можете использовать refreshToken для запроса вращающегося accessToken, когда вам нужно позвонить в Google API.

  • Вы также можете добавить параметры accessType: 'offline' и prompt: 'consent', но это, вероятно, не то, что вы хотите в веб-приложении.

    С их помощью каждый пользователь будет одобрять доступ к вашему приложению при каждом подписании. Несмотря на название, утверждениеPrompt не применяет это, по крайней мере, не в текущей версии API (судя по количеству людей, упоминающих об этом, и как часто API-интерфейсы OAuth полностью изменяют это поведение отличается).

    Это не отличный подход для веб-приложений, поскольку это не отличный пользовательский интерфейс, но может быть полезен для отладки.