passport.js 是不是支持 ajax?

Posted

技术标签:

【中文标题】passport.js 是不是支持 ajax?【英文标题】:Does the passport.js support ajax?passport.js 是否支持 ajax? 【发布时间】:2015-06-18 21:24:03 【问题描述】:

我想用passport.js 进行ajax 登录。我有设置passport.js的常用代码:

//route
app.post('/api/auth/login', passport.authenticate('local-login', 
    successRedirect: '/',
    failureRedirect: '/login'
));

//config strategy
passport.use('local-login', new LocalStrategy(
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
, loginUser));

var loginUser = function(req, email, password, done) 

    UserRepo.getOne(
        'local.email': email
    ).done(function(user) 

            if (!user || !user.validPassword(password)) 
                return done(null, false, 
                    message: 'user or password is incorrect'
                );
            

            return done(null, user);

        ,
        function(err) 
            return done(err);
        );
;

这是我的react 组件:

var Login = React.createClass(
  //...
  handleSubmit: function (e) 
        e.preventDefault();

        var email = this.state.email.trim();
        var password = this.state.password.trim();
        var data = 
            email: email,
            password: password
        ;

        api.auth.login(data, function (result) 
            console.log(result);            
        );    
    ,

    render: function () 
        return (
            <form className="login-form" onSubmit=this.handleSubmit>
                <section>
                    <label>email</label>
                    <input name="email" type="text" />

                    <label>password</label>
                    <input name="password" type="password"  />
                </section>
                <section>
                    <input type="submit" value="send"/>
                </section>
            </form>
        );
    
  //...
)

但是,它不起作用,因为重定向(successRedirectfailureRedirect)会起作用。如果我删除 failureRedirect 我会得到 401 状态。我了解我的 passport 代码用于服务器端渲染和页面刷新,但我找不到任何有关 ajax 登录的文档。

【问题讨论】:

【参考方案1】:

您可以使用自定义回调返回 JSON 数据。

app.post('/api/auth/login', function(req, res, next) 
    passport.authenticate('local-login', function(error, user, info) 
        if(error) 
            return res.status(500).json(error);
        
        if(!user) 
            return res.status(401).json(info.message);
        
        res.json(user);
    )(req, res, next);
);

【讨论】:

以上是关于passport.js 是不是支持 ajax?的主要内容,如果未能解决你的问题,请参考以下文章

phonegap ajax 用户身份验证与 nodejs-express-mongodb-passport js

Passport-local mongoose node.js 支持多种用户类型

Okta 是不是使用 Passport.js?

[转]passport.js学习笔记

Passport.js - req.isAuthenticated 不是一个函数

Passport.js本地策略如何保护路线