Javascript 如何使用passport.js将数据从React客户端传递到Oauth2.0 Google策略流

Javascript 如何使用passport.js将数据从React客户端传递到Oauth2.0 Google策略流,javascript,node.js,reactjs,oauth-2.0,passport.js,Javascript,Node.js,Reactjs,Oauth 2.0,Passport.js,我想在React客户端使用用户提供的用户名,并在身份验证过程中将其传递到服务器端的GoogleOAuth中。我最初认为我可以通过调用/api/auth/google/${username}将其与req.params.username一起传递,并使用req.update()将其保存到我的mongo数据库,或者将其附加到google通过profile.username=req.params.username返回的profile对象。不幸的是,我对谷歌策略作为中间件的工作原理还不够熟悉 目前,用户通过

我想在React客户端使用用户提供的用户名,并在身份验证过程中将其传递到服务器端的GoogleOAuth中。我最初认为我可以通过调用/api/auth/google/${username}将其与req.params.username一起传递,并使用req.update()将其保存到我的mongo数据库,或者将其附加到google通过profile.username=req.params.username返回的profile对象。不幸的是,我对谷歌策略作为中间件的工作原理还不够熟悉

目前,用户通过发送到/api/auth/google进行注册,然后google策略自动处理流

    app.get('/auth/google', passport.authenticate('google', {
        scope: ['profile', 'email']
      }))
我的谷歌战略如下:

    passport.use(new GoogleStrategy(
      {
      clientID: keys.googleClientID,
      clientSecret: keys.googleClientSecret,
      callbackURL: "/auth/google/callback",
      proxy: true
    }, 
    async (accessToken, refreshToken, profile, done) => {
      const existingUser = await User.findOne({ googleId: profile.id, 
    image: profile.photos[0].value})

      if (existingUser){
        return done(null, existingUser);
      } 

      const newUser = new User({ googleId: profile.id, image: 
    profile.photos[0].value}).save();  
      done(null, newUser);    
      })
    );
以及回调路径:

    app.get('/auth/google/callback', passport.authenticate('google'), 
       (req, res) => {
         res.redirect('/')
       })

由于返回的用户配置文件保存在Google strategy本身内部的mongo db中,因此我不确定如何将req.params.username附加到配置文件对象。在我执行newUser=().save()命令之前,有没有关于如何在Google策略中访问用户名的建议?或者有没有更好的方法将用户名附加到保存的用户?

您的原始想法是正确的;您只是缺少一个实现细节。OAuth2策略,就像您在这里使用的Google策略一样,可以在策略配置选项中传递一个
{passReqToCallback:true}
标志。设置此选项后,您的回调将可以访问原始请求:

passport.use(new GoogleStrategy({
  clientID: keys.googleClientID,
  clientSecret: keys.googleClientSecret,
  callbackURL: "/auth/google/callback",
  proxy: true,
  passReqToCallback: true
}, 
async (req, accessToken, refreshToken, profile, done) => {
  // Now you have access to the original req.params.username, or any data
  // the original request has attached to it
  ...
})
另见:


这正是我想要的,非常感谢你抽出时间来帮助我,安迪。