代码之家  ›  专栏  ›  技术社区  ›  AngularBoy

Angular 6 passport facebook不适用于Heroku

  •  0
  • AngularBoy  · 技术社区  · 6 年前

    当我点击Heroku上的facebook按钮时,url从 https://example.com/#/login https://example.com/api/user/facebook 然后再换回去,就这样了。Heroku日志中没有任何信息表明它达到了api。

    docs 我的登录页包含一个链接:

    <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在config中设置正确,并与添加到facebook开发者控制台的url匹配。我看不出有什么不对劲。

    1 回复  |  直到 6 年前
        1
  •  0
  •   AngularBoy    6 年前

    所以经过多次尝试错误和谷歌搜索,我发现Facebook只允许来自HTTPS的请求。尽管我的Heroku域是HTTPS,但它没有ssl证书。我升级到了一个嗜好dyno,并在Heroku的设置中应用了ssl证书,现在它可以工作了。