我已添加Google +登录,但回调似乎无效。
注意: 代码改编自本教程:https://scotch.io/tutorials/easy-node-authentication-google
似乎无法调用应该是的回调网址: https://gym-up-server.herokuapp.com/api/v1/oauth/google/callback
我使用以下依赖项:Express,MySQL,Sequelize,Passport
这是我的代码:
路线:
// =====================================
// GOOGLE ROUTES =======================
// =====================================
// send to google to do the authentication
// profile gets us their basic information including their name
// email gets their emails
router.get(
"/google",
passport.authenticate("google", { scope: ["profile", "email"] })
);
// the callback after google has authenticated the user
router.get("/google/callback", passport.authenticate("google"),
function(req,res) {
res.render("index");
console.log("After Passport AUTH");
});
Passport JS
// =========================================================================
// GOOGLE ==================================================================
// =========================================================================
passport.use(
new GoogleStrategy(
{
clientID: configAuth.googleAuth.clientID,
clientSecret: configAuth.googleAuth.clientSecret,
callbackURL: configAuth.googleAuth.callbackURL
},
function(token, refreshToken, profile, done) {
console.log("getting data from Google");
// make the code asynchronous
// User.findOne won't fire until we have all our data back from Google
process.nextTick(function() {
// try to find the user based on their google id
console.log("profile ID :", profile.id);
models.User.findOne({ where: { ggId: profile.id } }).then(function(
user
) {
// if (err) return done(err);
if (user) {
// if a user is found, log them in
return done(null, user);
} else {
// if the user isnt in our database, create a new user
var data = {
// set all of the relevant information
ggId: profile.id,
ggToken: token,
ggName: profile.displayName,
ggEmail: profile.emails[0].value // pull the first email
};
//save user
models.User.create(data, {
fields: ["ggId", "ggToken", "ggName", "ggEmail"]
}).then(function(insertedUser) {
console.log(
"User Created!" + ": " + insertedUser.get({ plain: true })
);
// console.log("about to run DONE to go back to ROUTE");
// return done(null, insertedUser.get({ plain: true }));
if (!insertedUser) {
console.log("failed to insert user - nothing found!");
return done(null, false);
}
if (insertedUser) {
console.log("about to run DONE to go back to ROUTE");
return done(null, insertedUser);
}
});
}
});
});
}
)
);
答案 0 :(得分:0)
您需要将回调网址传递给回调路由中的Google身份验证。您提到的教程有successRedirect和failureRedirect路由。
例如:添加成功和失败路线如下。
// route for success
app.get('/', function(req, res) {
res.render('index.ejs'); // load the index.ejs file
});
// route for failure
app.get('/profile', isLoggedIn, function(req, res) {
res.render('profile.ejs', {
user : req.user // get the user out of session and pass to template
});
});
然后将通过成功和失败路由添加到Google身份验证
app.get('/auth/google/callback',
passport.authenticate('google', {
successRedirect : '/profile',
failureRedirect : '/'
}));
答案 1 :(得分:0)
我找到了解决方案。但我不完全确定它为什么会起作用。
// the callback after google has authenticated the user
router.get("/google/callback", function(req, res, next) {
passport.authenticate("google", function(err, user, info) {
res.redirect("/profile");
})(req, res, next);
});
希望这有助于其他人。花了很长时间才弄明白这个!