Passport 中间件预期参数

Passport middleware expected parameters

我正在尝试通过 angular 将登录信息从表单传递到后端 express 端点。进行身份验证的护照中间件每次都失败并转到失败重定向。问题是我无法通过文档找到它期望的 POST 参数,或者它对它们做了什么。这是我使用的策略的失败(通过 userapp.io 的插件)还是实际的 username/password 错误?

登录端点如下所示:

router.post('/login', passport.authenticate('userapp', {
    failureRedirect: '#/login',
    failureFlash: 'Invalid username or password',
    successFlash: 'Welcome!' }),
    function (req, res) {
            res.cookie(SESSION_TOKEN, req.user.token);
            res.redirect('/');
        });

(请注意,这最终连接到 /auth/login,这与下面的 post 操作匹配)

提交到该端点的表单如下所示:

<form method='post' action='/auth/login'>
    <input name="login" placeholder="Username"><br>
    <input name="password" placeholder="Password" type="password"><br>
    <p><button type="submit">Log in</button></p>

    <p ng-show="loading"><img src="https://app.userapp.io/img/ajax-loader-transparent.gif"></p>
    <p ng-show="error">{{ error.message }}</p>
</form>

这是否正确地将数据提交到端点,我该如何进一步调试正在发生的事情?现在观察到的行为只是登录失败,用户最终在失败重定向。

我知道的另一个选择是使用 ua-login 指令 shown in this example 而不是我自己的表单。问题在于似乎有一些未记录的配置魔法;使用 ua-login 指令会导致客户端尝试 post 到不存在的 URL。现有教程似乎没有说明使 ua-login 工作所需的配置。

您可以更改定义策略的默认参数(usernamepassword)。

根据 docs:

passport.use(new LocalStrategy({ // or whatever you want to use
    usernameField: 'login',    // define the parameter in req.body that passport can use as username and password
    passwordField: 'password'
  },
  function(username, password, done) { // depending on your strategy, you might not need this function ...
    // ...
  }
));

对于您提到的特定策略 (userapp),我查看了源代码。您可以找到这些值 here。如果 usernameFieldpasswordField 不存在,将使用默认值(usernamepassword)。