【问题标题】:passport-facebook: how to dynamically set callbackURL?passport-facebook:如何动态设置回调 URL?
【发布时间】:2012-12-16 05:14:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

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

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

    还有 https://github.com/jaredhanson/passport-facebook/issues/2 中的 cmets 用于自定义 callbackURL

    【讨论】:

      【解决方案2】:

      我使用这个解决方案,这很容易。我将最后一个 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
      

      【讨论】:

        【解决方案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)
        })
        

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

        【讨论】:

          【解决方案4】:

          使用passport 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)
          );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-29
            • 1970-01-01
            • 2016-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-23
            相关资源
            最近更新 更多