1

Ich versuche die Authentifizierung von pass.js in einer Sails.js App mithilfe der Google OAuth2.0-Strategie zu implementieren. Ich habe überlegt, sails-generate-auth und sails-auth zu verwenden, aber sie werden nicht mehr unterstützt. Ich habe auch Waterlock in Betracht gezogen, aber es funktioniert nur mit den lokalen, Twitter und Facebook Strategien.Was ist der Grund für den InternalOAuthError in meiner Implementierung von sails.js pass.js?

Die folgende Funktion google() wird aufgerufen, wenn der Benutzer die Schaltfläche "Login mit Google +" drückt. Das erwartete Verhalten ist, dass der Benutzer dann zu einer Google-Seite weitergeleitet wird, wo er aufgefordert wird, sich zu authentifizieren. Tatsächlich wird der folgende Fehler in der markierten Zeile protokolliert. Das Benutzerobjekt ist zu diesem Zeitpunkt nicht definiert.

InternalOAuthError: Failed to obtain request token (status: 307 data: <HTML> 
<HEAD> 
<TITLE>Temporary Redirect</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Temporary Redirect</H1> 
The document has moved <A HREF="https://accounts.google.com/OAuthGetRequestToken">here</A>. 
</BODY> 
</HTML> 
) 

Die unten Funktion ist in den AuthController gelegen und wird nach dem Klicken auf die ‚Login mit Google+‘ Taste aufgerufen.

google(request, response) { 
    const google = sails.config.oauth.google; 
    passport.use(new GoogleStrategy({ 
      consumerKey: MY_KEY, 
      consumerSecret: MY_SECRET, 
      callbackURL: 'http://localhost:1337/auth/callback/google', 
     }, (token, tokenSecret, profile, done) => { 
      //Verify callback: Never appears to get called. 
      User.findOrCreate({ providerId: profile.id, provider: 'Google' }).then((user) => { 
       request.session.me = user; 
       return done(user); 
      }).catch(error => { 
       sails.log('Failed to log in using Google: ' + error); 
      }); 
     } 
    )); 

    passport.authenticate('google', { 
     failureRedirect: '/login', 
     scope: [ 
      'profile', 
     ], 
    }, function(error, user) { 
     //Gets called, but user is undefined. 
     if (error) { 
      sails.log('Err: ' + error); //<== Error gets logged here. 
     } 
     request.logIn(user, function(error) { 
      if (error) { 
       sails.log('err: ' + error); 
       response.view('500'); 
       return; 
      } 
      res.redirect('/'); 
     }); 
    })(request, response); 
}, 

Sonstige Informationen: Pass in config/policies.js initialisiert wird:

'*': [ 
    passport.initialize(), 
    passport.session(), 
], 

Meine Frage: Was ist die wahrscheinliche Ursache des Fehlers erhalte ich?

Antwort

0

Ich lief in das gleiche Problem mit Express, Pass und Pass-google-Eid. Ich löste das, indem ich zu passport-google-oauth20 wechselte.

Ich bin mir nicht 100% sicher, wenn das der Grund ist, aber Google scheint die OAuth-Unterstützung schon eine ganze Weile zurückgeworfen zu haben.

Wichtig: OAuth 1.0 wurde am 20. April 2012 offiziell nicht weiter unterstützt und wird nicht mehr unterstützt. Wir empfehlen Ihnen, so schnell wie möglich zu OAuth 2.0 zu migrieren.

Du musst deine Strategie ändern:.

var GoogleStrategy = require ('Pass-google-oauth20') Strategie;

passport.use(new GoogleStrategy({ 
    clientID: GOOGLE_CLIENT_ID, 
    clientSecret: GOOGLE_CLIENT_SECRET, 
    callbackURL: "http://www.example.com/auth/google/callback" 
    }, 
    function(accessToken, refreshToken, profile, cb) { 
    User.findOrCreate({ googleId: profile.id }, function (err, user) { 
     return cb(err, user); 
    }); 
    } 
));