PassportJS - FacebookTokenStrategy 返回 404

Posted

技术标签:

【中文标题】PassportJS - FacebookTokenStrategy 返回 404【英文标题】:PassportJS - FacebookTokenStrategy returns 404 【发布时间】:2013-12-12 15:29:13 【问题描述】:

我正在使用 PassportJS 来处理浏览器和移动客户端的 FB 身份验证。对于网络用户,我正在使用 Passport FacebookStrategy,这按预期工作。我还想允许移动客户端访问我的 API。我正在尝试使用 Passport FacebookTokenStrategy 来促进这一点。这似乎解决了一个小问题。当移动客户端向服务器发出 GET 请求时,将使用 FacebookTokenStrategy 并调用验证回调函数。在验证功能中,我可以看到用户配置文件可用,因此身份验证成功。但是,404 的 HTTP 状态会在响应中发送回移动客户端。我不确定如何正确配置它。这是我目前正在尝试的:

// Web based auth
passport.use(new FacebookStrategy(
  clientID: Config.facebook.clientID,
  clientSecret: Config.facebook.clientSecret,
  callbackURL: "http://localhost/auth/facebook/callback"
,
function(accessToken, refreshToken, profile, done) 
 User.findOrCreate(profile, function(err, user)
  done(err, user);
);

));

// Mobile client auth
passport.use(new FacebookTokenStrategy(
  clientID: Config.facebook.clientID,
  clientSecret: Config.facebook.clientID
,
function(accessToken, refreshToken, profile, done) 
  console.log(profile);
  User.findOrCreate(profile, function(err, user)
    done(err, user);
  );

));

// Redirect the user to Facebook for authentication.  When complete,
// Facebook will redirect the user back to the application at
//     /auth/facebook/callback
exports.fb_auth = passport.authenticate('facebook', scope: 'email' );
// Facebook will redirect the user to this URL after approval.  Finish the
// authentication process by attempting to obtain an access token.  If
// access was granted, the user will be logged in.  Otherwise,
// authentication has failed.
exports.fb_callback = passport.authenticate('facebook',  successRedirect: '/',
  failureRedirect: '/login' );
// Mobile Authentication
exports.mobile_fb_auth = passport.authenticate('facebook-token');

我应该提供 passport.authenticate('facebook-token');有一些额外的“onsuccess”回调?这在网络客户端的上下文中是有道理的,但我不确定应该如何使用 facebook-token 策略来处理。

【问题讨论】:

嗨。你知道404问题的原因吗?我面临同样的问题 您好,我也遇到过类似的问题。首先,我看到您使用 Config.facebook.clientID 作为 clientID 和 clientSecret。可能是错字?你实现了 User.findOrCreate 方法吗?你在 app.use(passport.initialize()) 之后实现了 passport.serializeUser 和 passport.deserializeUser 吗? btw... 如果您还没有尝试过,我可以推荐编辑 Brackets。它有一个很棒的节点调试器Theseus。奇怪的是你得到一个 404 你......如果它是一个 401 或 500 会更有意义...... @jonasonline 嘿,有人解决了这个问题吗?我也有同样的问题 @ScootaP 好吧。我不记得我是否确实遇到了这个问题,但我有一个我使用的身份验证解决方案。我编写了一个小中间件来处理身份验证和用户管理。如果您想使用其中的任何一个,我将所涉及的代码(希望我得到了所有)添加到gist? express 4 的代码还没有更新... 【参考方案1】:

我刚刚遇到了同样的问题,并且能够解决它。由于中间件在 express 中的工作方式,返回 404。您需要传入第三个响应成功的函数。

第三个函数并不总是被调用。只有在前面的中间件成功时才会调用它。

apiRouter.get('/auth/facebook',
    // authenticate with facebook-token.  
    passport.authenticate('facebook-token'),

    // if the user didn't successfully authenticate with the above line, 
    // the below function won't be called
    function(req, res)
        res.send(200);
    );

`

【讨论】:

以上是关于PassportJS - FacebookTokenStrategy 返回 404的主要内容,如果未能解决你的问题,请参考以下文章

PassportJS - FacebookTokenStrategy 返回 404

同时使用 JWT 和 Passportjs

PassportJs 身份验证无限循环和执行(默认)查询

PassportJS、NestJS:AuthGuard('jwt') 的 canActivate 方法

Passportjs 的会话问题

使用 Passportjs 刷新页面后保持身份验证