17

我正在按照此示例设置 FacebookStrategy - https://github.com/jaredhanson/passport-facebook/blob/master/examples/login/app.js

我想动态设置callbackURL,即:用户访问/posts/34,所以回调将是/posts/34/callback

我怎样才能实现这样的目标?

4

4 回答 4

11

我找到了解决方案,身份验证重定向路由和回调路由都应该用函数(req,res,next)包装passport.authenticate()。

我按照http://passportjs.org/guide/authenticate/中的示例进行自定义回调

以及https://github.com/jaredhanson/passport-facebook/issues/2中关于自定义回调 URL的评论

于 2013-01-02T09:01:02.557 回答
10

我使用这个解决方案,这很容易。我将最后一个 url 保存在会话中,然后收集它。如果您将回调 url 直接传递给 fb,则需要允许所有不同的路由,这很麻烦。

  app.get '/auth/facebook/', routesService.clean, (req, res, next) ->
    req.session.redirect = req.query.redirect if req.session? && req.query.redirect?
    passport.authenticate('facebook', { scope: ['user_friends'] }) req, res, next
    return

  app.get '/auth/facebook/callback', passport.authenticate('facebook', failureRedirect: '/login'), (req, res) ->
        # Successful authentication, redirect home.
        if req.session?.redirect?
          rediredUrl = req.session.redirect
          delete req.session.redirect
          res.redirect '/#!'+ rediredUrl
        else
          res.redirect '/'
        return
于 2016-10-12T15:14:41.870 回答
3

只是跟进 Gal 的回答,这是综合解决方案:

app.get('/auth/facebook', (req, res, next) => {
  passport.authenticate('facebook')(req, res, next)
})

app.get("/auth/facebook/callback", (req, res, next) => {
  passport.authenticate('facebook', (err, user, info) => {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login')}
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.uid)
    });
  })(req, res, next)
})

请注意,您必须专门登录用户。

于 2017-04-26T15:17:54.993 回答
0

使用护照 js,您可以设置successReturnToOrRedirect

router.get('/facebook/callback', (req, res, next) =>
    passport.authenticate('facebook', {
        callbackURL: `https://${req.get('host')}/api/auth/facebook/callback`,
        successReturnToOrRedirect: req.session.redirect || '/',
        failureRedirect: '/',
        successRedirect: '/',
    })(req, res, next)
);
于 2020-01-08T09:27:53.737 回答