【发布时间】:2022-08-16 18:42:44
【问题描述】:
我正在为不同的社交媒体登录使用护照策略并收到以下两个错误
- InternalOAuthError:无法获取用户配置文件
- 在将标头发送到客户端后无法设置标头
我怀疑在某处我已经返回了回调或响应,因此出现第二个错误,但第一个不知道原因范围似乎是正确的!策略代码
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