Google Passport策略-何时使用password.use回调? callbackURL?

时间:2019-05-26 22:39:54

标签: javascript node.js passport.js passport-google-oauth passport-google-oauth2

我正在使用Passport并正在研究Google OAuth 2 strategy。我无法理解流程。

这是official docs中的代码:

var passport = require('passport');
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

// Use the GoogleStrategy within Passport.
//   Strategies in Passport require a `verify` function, which accept
//   credentials (in this case, an accessToken, refreshToken, and Google
//   profile), and invoke a callback with a user object.
passport.use(new GoogleStrategy({
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "http://www.example.com/auth/google/callback"
  },
  function(accessToken, refreshToken, profile, done) {
       User.findOrCreate({ googleId: profile.id }, function (err, user) {
         return done(err, user);
       });
  }
));

然后是路线:

// GET /auth/google
//   Use passport.authenticate() as route middleware to authenticate the
//   request.  The first step in Google authentication will involve
//   redirecting the user to google.com.  After authorization, Google
//   will redirect the user back to this application at /auth/google/callback
app.get('/auth/google',
  passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login'] }));

// GET /auth/google/callback
//   Use passport.authenticate() as route middleware to authenticate the
//   request.  If authentication fails, the user will be redirected back to the
//   login page.  Otherwise, the primary route function function will be called,
//   which, in this example, will redirect the user to the home page.
app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });

这是我对流程的理解。用户单击一个按钮以在浏览器上使用google登录。请求已发送到/auth/google。哪个调用passport.authenticate。从那里开始,Google处理一些事情,一旦用户授予我们访问其Google帐户的权限,那是我不了解的部分。

下一步是什么?看来Google会回复我们提供的callbackURL。但是在那种情况下,passport.use的回调何时运行?该回调函数正在接受accessTokenrefreshTokenprofile,因此似乎它是接收Google响应的对象,而不是callbackURL

1 个答案:

答案 0 :(得分:0)

在您的应用程序中,当用户首次授予您通过Google验证帐户的权限时,有两个可能的“流程”可供考虑:

  • 用户已经在您的系统中拥有一个现有帐户,并希望将该帐户链接到她的Google身份。
  • 用户正在您的系统中创建一个新帐户,您可以选择使用其Google身份创建新帐户

如果用户选择使用Google进行身份验证的最终结果是您数据库中的一条记录,其中包含从Google的身份验证服务响应中提供的其他信息。数据看起来类似于this page in passport docs

使用带有令牌的对象的第一个参数进行的passport.use(...)调用是护照用来访问Google系统(标准OAUTH2凭据)的方式。第二个参数是与系统数据层交互的回调函数,例如:User.findOrCreate(data)

在以后访问您的应用程序时,用户可以利用其帐户与Google身份“关联”这一事实,并具有简单的登录体验。