首页 > 解决方案 > 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 开发者控制台的匹配。我看不出有什么不对。

标签: node.jsangularherokumean-stackpassport-facebook

解决方案


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


推荐阅读