我正在使用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
的回调何时运行?该回调函数正在接受accessToken
,refreshToken
和profile
,因此似乎它是接收Google响应的对象,而不是callbackURL
。
答案 0 :(得分:0)
在您的应用程序中,当用户首次授予您通过Google验证其帐户的权限时,有两个可能的“流程”可供考虑:
如果用户选择使用Google进行身份验证的最终结果是您数据库中的一条记录,其中包含从Google的身份验证服务响应中提供的其他信息。数据看起来类似于this page in passport docs。
使用带有令牌的对象的第一个参数进行的passport.use(...)
调用是护照用来访问Google系统(标准OAUTH2凭据)的方式。第二个参数是与系统数据层交互的回调函数,例如:User.findOrCreate(data)
。
在以后访问您的应用程序时,用户可以利用其帐户与Google身份“关联”这一事实,并具有简单的登录体验。