【问题标题】:Getting erros using passport-google-oauth20 InternalOAuthError: Failed to fetch user profile and Cannot set headers after they are sent to the client使用passport-google-oauth20 InternalOAuthError获取错误:无法获取用户配置文件并且在将标头发送到客户端后无法设置标头
【发布时间】:2022-08-16 18:42:44
【问题描述】:

我正在为不同的社交媒体登录使用护照策略并收到以下两个错误

  1. InternalOAuthError:无法获取用户配置文件
  2. 在将标头发送到客户端后无法设置标头
    我怀疑在某处我已经返回了回调或响应,因此出现第二个错误,但第一个不知道原因范围似乎是正确的!

    策略代码

    passport.use(new GoogleStrategy({
      clientID: GOOGLE_CLIENT_ID,
      clientSecret: GOOGLE_SECRET_KEY,
      callbackURL: GOOGLE_CALLBACK_URL
    }, async (acessToken, refreshToken, profile, done) => {
      await User.findOne({ email: profile._json.email }, async (err, user) => {
        if (err) {
          console.log(\"passport.config --> err\", err);
         done(err, null);
        } else if (user) {
          if (user.socialType !== \"GOOGLE\" || user.socialType === null)
            done(`LOGIN_CREDENTIALS_WITH_${(user.socialType || \"PASSWORD\").toUpperCase()}`, false);
          else {
           done(null, user);
          }
        } else {
          // console.log(profile);
          const user = {
            email: profile._json.email,
            socialId: profile.id,
            socialType: \"GOOGLE\",
            firstName: profile.name.givenName,
            lastName: profile.name.familyName,
            isActive: profile._json.email_verified,
            isVerified: profile._json.email_verified,
            socialImageUrl: profile._json.picture,
            userType: \"CUSTOMER\"
          };
          const newUser = new User({ ...user });
          const newUserData = await newUser.save();
         done(null, newUserData);
        }
      });
    }));
    

    路线代码:

    router.get(\'/auth/:socialType\', customerCtrl.socialTypeLogin);
    
    router.get(\'/auth/:socialType/callback\', customerCtrl.socialTypeLoginCallback);
    

    控制器代码:

    const socialTypeLogin = async (req, res) => {
        await customerService.socialTypeLogin(req, res);
    };
    
    const socialTypeLoginCallback = async (req,res) => {
      await customerService.socialTypeLoginCallback(req,res);
    };
    

    服务代码:

    const socialTypeLogin = async (req, res) => {
        try {
          const socialType = (req.params.socialType || \'\').toLowerCase();
          const GOOGLE_SCOPE = [\'email\', \'profile\'];
          const FACEBOOK_SCOPE = [\'email\'];
          let scope = [];
          if (socialType === \'google\') {
            scope = GOOGLE_SCOPE;
          } else if (socialType === \'facebook\') {
            scope = FACEBOOK_SCOPE;
          }
          let oauthOptions = { scope: scope};
          const { returnUrl } = req.query;
          if(returnUrl && returnUrl.trim().length !== 0) {
            oauthOptions[\'state\'] =JSON.stringify({ returnUrl: returnUrl });
          }
          passport.authenticate(socialType, oauthOptions)(req, res);
        }
        catch (error) {
    
        }
    }
    
    /**
     * @param {string} socialType
     */
    
    const socialTypeLoginCallback = async (req, res) => {
      const socialType = (req.params.socialType || \'\').toLowerCase();
      // return new Promise((resolve, reject) => {
        try {
          passport.authenticate(socialType, async (err, user) => {
            let webappRedirectURL = WEBAPP_LOGIN_URL;
            try {
              const state = req.query.state; 
              if(state) {
                const stateObj = JSON.parse(state);
                webappRedirectURL = stateObj.returnUrl;
              }
            } catch (err1) {
              console.log(\"customer.service --> parsing error\",err1);
            }
            if (err || !user) {
              console.log(\"customer.service --> !user\",err);
              res.render(\'oauth-redirect\', {
                webappRedirectURL: webappRedirectURL,
                success: false,
                error: err,
                timerCounter: 5,
                accessToken: undefined
              });
            }
            else {
              console.log(\"customer.service --> Generating Token\",user.generateJWT());
              res.render(\'oauth-redirect\', {
                webappRedirectURL: webappRedirectURL,
                success: true,
                timerCounter: 5,
                accessToken: user.generateJWT(),
                error: undefined
              });
            }
          })(req, res);
        } 
        catch (error) {
          console.log(\"customerService.js ==> socialTypeLoginCallback -->\",error);
        }
    };
    

    提前感谢您的帮助!我怀疑在某处我已经返回了回调或响应,因此出现第二个错误,但第一个不知道原因范围似乎是正确的!

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


    【解决方案1】:

    socialTypeLogin 添加行

    oauthOptions['session'] = false;
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2021-05-16
      • 2020-06-21
      • 2019-10-20
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多