node.js - 带有passportjs + Vue的谷歌oAuth
问题描述
我目前被困在连接到我自己的节点 express api 服务器的 vue 应用程序中处理 google oAuth 登录。
在 express api 服务器上,我使用护照作为中间件来处理 google oauth,并且在通过 google 成功登录后,我在后端的回调中生成了一个 jwt。
passport.use(new GoogleStrategy({
clientID: config.get('google.clientID'),
clientSecret: config.get('google.clientSecret'),
callbackURL: config.get('google.callbackUrl'),
},
function(accessToken, refreshToken, profile, done) {
User.findOne(
{ socialID: profile.id },
function (err, user) {
if (err) {
return done(err);
}
//No user was found... so create a new user with values from Facebook (all the profile. stuff)
if (!user) {
user = new User({
name: profile.displayName,
email: profile.emails[0].value,
provider: profile.provider,
socialID: profile.id,
});
user.save(function(err) {
if (err) console.log(err);
});
}
// the information which shall be inside the jsonwebtoken
const payload = {
user: {
id: user.id
}
};
// create jsonwebtoken and return it
jwt.sign(
payload,
config.get('jwt.secret'), // get the secret from default.json to hash jsonwebtoken
{ expiresIn: config.get('jwt.lifetime') },
(err, token) => {
if(err) throw err; // if there is error, throw it and exit
return done(JSON.stringify(token)); // return jwt token
}
);
}
);
}
));
我的 api 服务器上有这些路由
// @route GET api/auth/google
// @desc Google auth route - get User From Google, store it if not exists yet
// @access Public
router.get('/google',
passport.authenticate('google', { scope: ['profile', 'email'], session: false })
);
// @route GET api/auth/google/callback
// @desc Google callback route
// @access Public
router.get('/google/callback',
passport.authenticate('google', { failureRedirect: '/', session: false }),
function (req, res) {
res.redirect('http://localhost:8080/?token=' + res);
}
);
当我在 /auth/google 调用我的后端 api 路由时,我成功地被重定向到谷歌登录页面。但是通过我的方法,我试图使用 get 参数“token”从回调 url 重定向回我的 vue 应用程序,以在前端接收令牌。我的后端回调路由中的重定向不起作用。如何将后端生成的令牌传递给我的前端?
解决方案
我发现重定向不起作用,因为 return done() 函数需要两个参数才能正常工作。
我在谷歌护照中间件中改变了这样的完成功能
jwt.sign(
payload,
config.get('jwt.secret'), // get the secret from default.json to hash jsonwebtoken
{ expiresIn: config.get('jwt.lifetime') },
(err, token) => {
if(err) throw err; // if there is error, throw it and exit
return done(null, token); // return jwt token
}
);
现在在我的路线中,我可以成功重定向 + 添加令牌作为获取参数 - 所以通过这个解决方法,我收到了我的 jwt,它是在我的前端的后端生成的。
// @route GET api/auth/google/callback
// @desc Google callback route
// @access Public
router.get('/google/callback',
passport.authenticate('google', { failureRedirect: '/', session: false }),
function (req, res) {
let token = res.req.user;
res.redirect('//localhost:8080/?token=' + token);
}
);
推荐阅读
- javascript - 在“离线”事件中中止 Ajax 调用
- python-2.7 - 如何构建更好的 Python-GUI?
- sql-server - 如何读取扩展事件 .xel 文件
- c# - ASP.NET Core 2.1 - 身份验证 cookie 已删除,但用户仍可以登录而不会被重定向到外部登录
- html - 如何在新窗口中打开我在 HTML 中创建的表单?
- sql - 根据时间戳和间隔计算结束时间
- c++ - 将值分配给向量(2D)的向量中的某个位置
- r - 如何将数据框中的值匹配到另一个
- python - 如何确定 Scrapy 项目加载器实现中的错误?
- javascript - 如何在 Chrome 扩展内容脚本中调用一个又一个函数