Angular 6 passport-facebook 在 Heroku 上不起作用



我在MEAN堆栈应用程序(Angular 6(中使用passport-facebook。它在开发中完美运行,但在 Heroku 的生产中不起作用。

当我点击Heroku上的Facebook按钮时,网址从 https://example.com/#/login 短暂地更改为 https://example.com/api/user/facebook 然后再次切换回来,这就是它所做的一切。Heroku日志中没有任何内容表明它到达了api。

根据文档我的登录页面包含一个链接:

<a href="/api/user/facebook" class="btn btn-primary">
<span class="fa fa-facebook"></span> Facebook
</a>

这会消耗我的 API

router.get('/facebook', (req, res, next) => {
console.log('/facebook');
req.session.redirect = req.query.redirectUrl;
passport.authenticate('facebook')(req, res, next);
return;

}(;

然后调用这个

passport.use(new FacebookStrategy({
clientID: config.facebookAuth.clientID,
clientSecret: config.facebookAuth.clientSecret,
callbackURL: config.facebookAuth.callbackURL
}, (token, refreshToken, profile, done) => {
User.findOne({
'facebook.id': profile.id
}, (err, user) => {
if (err) {
console.log(err);
return done(err);
}
if (user) {
return done(null, user);
} else {
var newUser = new User();
newUser.facebook.id = profile.id;
newUser.facebook.token = token;
newUser.facebook.displayName = profile.displayName;
newUser.save((err) => {
done(null, newUser);
});
}
}
)
}
)
)

然后调用回调

router.get('/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/#/login' }), (req, res) => {
console.log('/facebook/callback');
jwt.sign({
user: req.user
}, config.privateKey, { expiresIn: '1h' }, (err, token) => {
if (err) {
console.log(err)
}
res.cookie('token', token, { maxAge: 3600000 });
res.redirect(!!req.session.redirect ? '/#' + req.session.redirect : '/#/create');
});
});

回调 url 在配置中设置正确,并与添加到 facebook 开发者控制台的 url 匹配。我看不出有什么不对。

因此,经过多次尝试错误和多次Google搜索,我发现Facebook只允许来自HTTPS的请求。即使我的Heroku域是HTTPS,它也没有SSL证书。我升级到了一个爱好测功机,并在 Heroku 的设置中应用了 ssl 证书,它现在可以工作了。

最新更新