Passport中间件预期参数

时间:2015-12-21 21:32:52

标签: angularjs passport.js userapp

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

登录端点如下所示:

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,与下面的帖子操作匹配)

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

<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>

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

我知道的另一个选项是使用ua-login指令shown in this example而不是我自己的表单。麻烦的是,似乎有一些无证的配置魔法;使用ua-login指令导致客户端尝试发布到不存在的URL。现有教程似乎没有说明使ua-login工作所需的配置。

1 个答案:

答案 0 :(得分:1)

您可以更改定义策略的默认参数(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)。