2014-02-21 2 views
17

Я пытаюсь вернуть refreshToken с помощью паспортного модуля node.js. Однако я использую код ниже, и я не могу зарегистрировать токен обновления, но токен доступа работает нормально. Есть ли способ указать тип доступа в автономном режиме для этого модуля, чтобы, надеюсь, вернуть это?Паспорт - 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.

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

ответ

21

Эта задача была решена с этой ссылке:

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' }); 

Джаред Hanson - благословляю вас.

+0

Это не работает. По-прежнему получать значение токена обновления как неопределенное. – Foreever

+1

Вы включили опцию одобренияPrompt: «force»? Без меня это оставалось неопределенным. – MonsterWimp757

+0

Спасибо. теперь он работает. – Foreever

2

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

Вы не нуждаетесь вapprovalPrompt или prompt в запросе.

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

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

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

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

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

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

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

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

Смежные вопросы