2014-02-21 13 views
17

Ich versuche, ein RefreshToken mit dem Pass-Modul von node.js. Allerdings verwende ich den unten stehenden Code und ich kann keine Aktualisierungstoken protokollieren, aber das Zugriffstoken funktioniert einwandfrei. Gibt es eine Möglichkeit, den Zugriffstyp offline für dieses Modul anzugeben, um dies hoffentlich zurückzugeben?Passport - Node.js nicht zurück Refresh Token

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

Dies gibt den refreshToken als undefined zurück.

Jede Hilfe würde sehr geschätzt werden.

Antwort

21

Dies wurde mit diesem Link gelöst:

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

speziell:

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

Jared Hanson - Sie segnen.

+0

Dies funktioniert nicht. Immer noch Aktualisierungstokenwert als undefiniert erhalten. – Foreever

+1

Haben Sie die Option approvalPrompt: 'force' hinzugefügt? Es blieb undefiniert ohne dies für mich. – MonsterWimp757

+0

Danke. jetzt geht es. – Foreever

2

Alles, was Sie brauchen accessType: 'offline' und Sie werden die refreshTokenbei der ersten Anmeldung bekommen.

Sie brauchen nichtapprovalPrompt oder prompt in der Anfrage.

Hinweis funktioniert dies nur bei der ersten Anmeldung, wenn Sie mit einem Benutzerkonto bei der ersten Anmeldung die refreshToken und verbinden sie nicht erfassen und speichern Sie es nicht leicht wieder bekommen.

Wenn Sie es nicht jemand das erste Mal habe erfassen einloggt haben Sie zwei Möglichkeiten:

  1. Wenn sich ein Benutzer anmeldet, und Sie haben keinen refreshToken für sie, können Sie sofort Melden Sie sie zwanghaft ab und sagen Sie ihnen, dass Sie unter https://myaccount.google.com/permissions den Zugriff auf Ihre Anwendung widerrufen und sich dann erneut anmelden müssen.

    Wenn sie sich erneut anmelden, erhalten sie die gleiche Eingabeaufforderung, die sie bei der ersten Anmeldung erhalten haben, und Sie erhalten die refreshToken bei dieser ersten neuen Anmeldung. Stellen Sie sicher, dass Sie eine Methode in Ihrem Rückruf in Passport haben, um das refreshToken zu ihrem Benutzerprofil in Ihrer Datenbank zu speichern.

    Sie können dann mit dem refreshToken ein rotierendes accessToken anfordern, wenn Sie ein ein Google-API aufrufen müssen.

  2. Sie könnten auch beide accessType: 'offline' und prompt: 'consent' Optionen hinzufügen, aber das ist wahrscheinlich nicht das, was Sie in einer webbasierten Anwendung wollen.

    Mit dieser Option wird jeder Benutzer aufgefordert, den Zugriff auf Ihre App bei jeder Anmeldung unter zu bestätigen.Trotz des Namens, approvalPrompt erzwingt dies nicht, zumindest nicht in der aktuellen Version der API (nach der Anzahl der Leute, die es angeben und wie oft oAuth APIs ändern, ist es durchaus möglich, dieses Verhalten war unterschiedlich).

    Dies ist kein großartiger Ansatz für webbasierte Anwendungen, da es keine großartige Benutzererfahrung bietet, aber für das Debuggen nützlich sein könnte.