node.js中护照身份验证后如何发送json作为响应

Posted

技术标签:

【中文标题】node.js中护照身份验证后如何发送json作为响应【英文标题】:how to send json as a response after passport authenticationin node.js 【发布时间】:2014-08-14 11:01:57 【问题描述】:

我正在尝试这个git example。

当我将它与我的项目集成时效果很好,但我想要实现的是发送 json 作为对客户端/请求的响应,而不是 successRedirect : '/profile' & failureRedirect : '/signup'。

是否可以发送 json,或者是否有其他方法可以得到相同的?

任何帮助将不胜感激,TU

【问题讨论】:

【参考方案1】:

在这里我修改了我的代码以发送 json 作为响应

// process the signup form
app.post('/signup', passport.authenticate('local-signup', 
    successRedirect : '/successjson', // redirect to the secure profile section
    failureRedirect : '/failurejson', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
));

app.get('/successjson', function(req, res) 
    res.sendfile('public/index.htm');
);

app.get('/failurejson', function(req, res) 
    res.json( message: 'hello' );
);

【讨论】:

【参考方案2】:

您可以在 express 应用程序中使用护照的身份验证功能作为路由中间件。

app.post('/login',
  passport.authenticate('local'),
  function(req, res) 
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    // Then you can send your json as response.
    res.json(message:"Success", username: req.user.username);
  );

默认情况下,如果身份验证失败,Passport 将响应 401 Unauthorized 状态,并且不会调用任何其他路由处理程序。如果身份验证成功,将调用下一个处理程序,并将 req.user 属性设置为经过身份验证的用户。

【讨论】:

这是 IMO 最干净的解决方案。【参考方案3】:

创建新路线,例如:/jsonSend,其中包含res.json,然后创建successRedirect: '/jsonSend'。应该这样做。

【讨论】:

查看我下面的答案 如果这是您需要的并且对您有用,那么没关系;) 是的,我只想在身份验证后发送 json 是否有任何其他方法可以在同一个发布请求中获得成功/失败身份验证 恐怕我不明白你的意思。可以举例吗?【参考方案4】:

有一个官方的自定义回调文档:

app.get('/login', function(req, res, next) 
  passport.authenticate('local', function(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.username);
    );
  )(req, res, next);
);

https://github.com/passport/www.passportjs.org/blob/master/views/docs/authenticate.md

【讨论】:

【参考方案5】:

使用护照作为中间件。

router.get('/auth/callback', passport.authenticate('facebook'), 
    function(req, res)
        if (req.user)  res.send(req.user); 
        else  res.send(401); 
    );

【讨论】:

【参考方案6】:
// process the signup form
app.post('/signup', passport.authenticate('local-signup', 
    successRedirect : '/successjson', // redirect to the secure profile section
    failureRedirect : '/failurejson', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
));

app.get('/successjson', function(req, res) 
    res.sendfile('public/index.htm');
);

app.get('/failurejson', function(req, res) 
    res.json( message: 'hello' );
);

【讨论】:

以上是关于node.js中护照身份验证后如何发送json作为响应的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

带有 Passport 的 Node.js 身份验证:如果缺少字段,如何闪烁消息?

本地护照和本地护照猫鼬的身份验证错误

Node.js - JWT、API:如何实现多个 Passport.js 身份验证中间件?

护照后如何使用承诺登录。通过社会服务进行身份验证。 KeystoneJS + 护照