Passport" Hello World"总是失败

时间:2015-05-09 12:31:26

标签: javascript node.js express passport.js passport-local

我有以下内容:

import {Router} from 'express';
import passport from 'passport';
import {Strategy} from 'passport-local';
import pg from 'pg';
import {pgUri} from '../environment';

let loginRouter = Router();

passport.use(new Strategy((username, password, done) => done(null, true)));
//{
//    pg.connectAsync(pgUri)
//        .then(([client, release]) => {
//            return client.queryAsync('select * from users where "user" = $1::TEXT', [username])
//                .finally(release);
//        })
//        .tap(result => console.log(result.rows))
//        .then(result => done(null, true));
//}));

loginRouter.get('/', (request, response) => response.render('login'));
loginRouter.post('/', passport.authenticate('local', {successRedirect: '/',
                                                      failureRedirect: '/login'}));

export default loginRouter;

它是一个快速路由文件,定义了最简单的身份验证方案。以上内容始终重定向回/login,表示失败。

我尝试了什么

  • failureRedirect更改为/loginFailed确实会重定向到那里。所以登录确实失败了。
  • 功能体内的断点和console.log不会被击中。
  • 使用done调用done(null, {foo: "bar"})代替true,不会改变任何内容。

值得注意

  • 我使用babel支持ES6,但由于这是唯一失败的部分,我可以设置的断点(在passport.use之前)显示所有变量的预期值,我不知道认为这就是问题所在。
  • .get()路由按预期工作,显示表单。

我在自助阶段有这个:

app.use(session({
    secret: "some-secret",
    resave: true,
    saveUninitialized: true
}));

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser((user, done) => done(null, {foo: "bar"}));

passport.deserializeUser((user, done) => done(null, {foo: "bar"}));

以下是我使用的表单(直接从 passport example 复制而来)

<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <input type="submit" value="Log In"/>
    </div>
</form>

我不知道这里出了什么问题。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您需要使用某些东西来解析POST正文。

Passport旨在完成一件事:验证请求。它将所有其他功能(包括解析POST主体)委托给应用程序。他们在overview中说这个,但很容易低估其含义。

他们回到Configure页面的中间件部分中的主题,因此我建议您阅读。

我碰巧使用body-parser模块来处理这个问题(请阅读here)。