Паспорт - 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 полностью изменяют это поведение отличается).
Это не отличный подход для веб-приложений, поскольку это не отличный пользовательский интерфейс, но может быть полезен для отладки.