【问题标题】:Passport js local strategy custom callback "Missing credentials"Passport js 本地策略自定义回调“缺少凭据”
【发布时间】:2015-07-20 14:53:20
【问题描述】:

我有一个非常烦人的 Node js、express 4 和护照问题。我已经尝试了所有我能想到的选项,但仍然没有解决方案。无法从其他帖子中找到解决此问题的方法。

代码:

app.post('/login', function(req, res, next) {

    console.log(req.body.user_email);
    console.log(req.body.user_password);

    passport.authenticate('local', function(err, user, info) {

        console.log(info);
...

问题是由于某种原因,passport 没有获取凭据并在 console.log(info) 中显示“缺少凭据”,尽管在上面记录了用户名和密码时它们是正确的。本地策略也应该正确配置:

passport.use(new LocalStrategy ({

    usernameField: 'user_email',
    passwordField: 'user_password',
    },

    function(username, password, done) {

        console.log(username);
        console.log(password);
...

“功能(用户名,密码,完成)”永远不会运行,因为“缺少凭据”。

有趣的是,来自另一个 html/ejs 页面的身份验证调用是:

app.post('/login_user', passport.authenticate('local', { successRedirect: '/loginSuccess', failureRedirect: '/loginFailure' }));

问题不存在。

有人知道我在这里想念什么吗?!?!

谢谢!

【问题讨论】:

  • 您的app.use(passport... 是否出现在路由之前和会话中间件之后?
  • 是的,只有在 passport.use 之后出现的中间件是 i18n + html/ejs 文件所在的 views 文件夹的定义。
  • 尝试发布完整的代码,例如您如何配置local strategy,并在那里记录凭据?
  • 已经在 S/O stackoverflow.com/questions/17074375/… 上回答你还没有设置 body-parser 中间件
  • 我遇到了与 OP 类似的问题,正如@Offirmo 建议的 app.use(bodyParser.json());解决了我的问题

标签: node.js express passport.js


【解决方案1】:

我收到缺少凭据的错误是当我将电子邮件作为第一个参数发送时,但护照本地策略接受第一个参数是用户名 所以你需要将它设置为这样的电子邮件:

passport.use(
    new LocalStrategy({ usernameField: "email" }, (email, password, done) => {

【讨论】:

    【解决方案2】:

    以防万一这对将来的某人有用.. 如果您使用 POSTMAN 并发送 POST 请求(例如电子邮件和密码字段)并且您发现自己看到此“缺少凭据”响应,请确保响应的格式设置为 JSON 而不是 html 或文本犯这样一个简单的错误会让你卡住几个小时

    【讨论】:

    • 啊,就是这样!这需要更多的支持。将我的邮递员切换为使用原始 json 并且它有效!
    【解决方案3】:

    如何以 HTML 形式格式化数据

    我在这里使用Postman 来演示您的问题:

    这不好

    只是我想要的输出

    不以 (req, res) 结束

    虽然这可能有点不相关,但如果我不这样做,也会出现同样的问题。

    1. 在启动 passport.authenticate 之前调用 req and res parameters
    2. 关闭passport.authenticate 后,使用(req, res) 完成它

    您需要在函数结束时使用(req, res),如下所示:

    router.post('/signup', 
    (req, res, next) => passport.authenticate('whatever-your-strategy-name-is', function(err, user, info) {
    
        // Just to see the sample expected output
        res.send(JSON.stringify(info)).status(200)
    
      })(req, res)
    );
    

    在标准熟悉的 JS 中,它看起来像这样。

    router.post('/signup', function (req, res, next) {
    
      passport.authenticate('whatever-your-strategy-name-is', function(err, user, info) {
    
        // Just to see the sample expected output
        res.send(JSON.stringify(info)).status(200)
    
      })(req, res) // passport.authenticate ends here
    })
    

    【讨论】:

      【解决方案4】:

      有一个小错误或更正。

      你正在做:

      app.post('/login', function(req, res, next) {
      
          console.log(req.body.user_email);
          console.log(req.body.user_password);
      
          passport.authenticate('local', function(err, user, info) {
      
              console.log(info);
      

      只需创建一个user变量并设置传入的user_email & user_password,如下所示。

      app.post('/login', function(req, res, next) {
      
          console.log(req.body.user_email);
          console.log(req.body.user_password);
      
          var user = req.body;
      
          passport.authenticate('local', function(err, user, info) {
      
              console.log(info); 
      

      这应该可行。

      【讨论】:

      • 您没有使用您在任何地方创建的user 变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2019-03-19
      • 2020-12-19
      • 2017-10-31
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多