2019独角兽企业重金招聘Python工程师标准>>>
基本用法可参考以下文章:
passport.js学习笔记
http://idlelife.org/archives/808
Express结合Passport实现登陆认证
http://blog.fens.me/nodejs-express-passport/
官方文档
http://passportjs.org/docs
关于new LocalStrategy
# 方法一
LocalStrategy(
# 可以这样理解,前2个参数username, password实际是php里的
# $_POST['username']和$_POST['password']
# 如果通过表单传过来的参数不为默认的username, password,则可使用方法二
function verify(username, password, done) {
if ( username == 'admin' && password == 'admin-password' ) {
var user = {
username: 'admin'
};
return done(null, user);
}
return done(null, false, {message: '登录失败'});
}
);
# 方法二
LocalStrategy(
# 参数username, password实际是php里的 $_POST['email'] 和 $_POST['pass']
{
usernameField: 'email',
passwordField: 'pass'
},
function verify(username, password, done) {
if ( username == 'admin' && password == 'admin-password' ) {
var user = {
username: 'admin'
};
return done(null, user);
}
return done(null, false, {message: '登录失败'});
}
);
# 方法三
# 有可能验证登录时还需要检查验证码是否输正确,即需要其他的字段一起验证
# 那么可设置参数passReqToCallback为true,此时回调函数verify的第一个参数为req
# 然后通过req.body.XXX去获取其他的数据来一同验证
LocalStrategy(
{
passReqToCallback: true
},
function verify(req, username, password, done) {
if ( req.body.validCode == '1234' && username == 'admin' && password == 'admin-password' ) {
var user = {
username: 'admin'
};
return done(null, user);
}
return done(null, false, {message: '登录失败'});
}
);
关于上面LocalStrategy里verify函数的最后一个参数done,官方称之为verify callback
官方文档:http://passportjs.org/docs#verify-callback
# 源码里关于done的定义,一共3个参数
# err: 只有在发生严重错误时,才传入此参数,例如:数据库执行错误等,否则传入false
# user: 只有在验证登录通过时,才传入user变量,否则传入false
# info: 无论验证正确或者错误,都可以写入message,在其他页面读取
# info的格式一定是 {message: 'ERROR MESSAGE'} 对象的属性必须是message
done(err, user, info)
# 发生严重的错误时
done(err)
# 验证登录成功时
user = {id: 15, username: 'zhangsan', email: '[email protected]'};
done(null, user)
# 验证失败时
done(null, false, {message: '用户名密码错误,请重试'})
关于验证方法 passport.authenticate
app.post('/login', passport.authenticate('local', options));
官方文档:http://passportjs.org/docs/authenticate
options参数解释如下:
session: 默认true,是否将用户的登录状态记录到session,一般无需修改此选项,如果设置为false,那么一旦页面跳转,浏览器无法得知你的登录状态,这个选项应该是用于RESTful API之类的程序用的,因为这类程序每次请求都会需要验证
successRedirect: 如果登录成功那么就会跳转到指定页面,如果没指定,相当于执行了next()
failureRedirect:如果登录失败,则会跳转到指定页面,如果没有指定,页面会抛出一个401 Unauthorized错误
successReturnToOrRedirect:
如果为空,此选项不生效,如果指定了url,那么当登录成功以后
1. 首先会检查req.session.returnTo是否有值,如果存在,则跳转到这里
2. 如果req.session.returnTo为空,才跳转到指定的url
3. 无论这个参数是什么值,只要存在,页面就一定会跳转
注意:此方法会优先于successRedirect执行,根据第三点可知道,如果这个参数设置了值,那么再设置successRedirect就没有任何意义了。
使用场景:比如用户访问到一个没有权限的页面,你需要将他带回登录页面,待登录成功以后,再回到此页面,就可以将returnTo设置到session里。connect-ensure-login是一个很好的模块。
successFlash/failureFlash:
1. 如果不设置此参数或者为false,那么在其他页面无法获取verify callback方法info参数传入的message信息
2. 如果设置为true,那么在其他页面调用 req.flash() 就可以获取到verify callback方法info里的message信息(使用req.flash需要安装模块connect-flash)
3. 如果设置为字符串,那么在其他页面调用 req.flash() 时,就得到这个字符串,而非info
successMessage/failureMessage:
1. 同上面的第一点
2. 如果设置为true,那么verify callback方法info里的message信息会被写入到req.session.message而非通过 req.flash() 获取
3. 如果设置为字符串,那么在其他页面,也是通过 req.session.message 获取该字符串信息
4. 也就是说successFlash是通过 req.flash() 获取数据,而succcessMessage则是通过 req.session.messag 获取
assignProperty: 一般无需指定此参数,但是如果你需要自己定义登录行为的话,则可以传入这个值,然后在next方法里调用 req.login 来执行登录,并且user的信息会被保存到 req[assignProperty] 里