基本用法可参考以下文章:
passport.js学习笔记
Express结合Passport实现登陆认证
官方文档
关于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
官方文档:
# 源码里关于done的定义,一共3个参数# err: 只有在发生严重错误时,才传入此参数,例如:数据库执行错误等,否则传入false# user: 只有在验证登录通过时,才传入user变量,否则传入false# info: 无论验证正确或者错误,都可以写入message,在其他页面读取# info的格式一定是 {message: 'ERROR MESSAGE'} 对象的属性必须是messagedone(err, user, info)# 发生严重的错误时done(err)# 验证登录成功时user = {id: 15, username: 'zhangsan', email: 'zhang.san@example.com'};done(null, user)# 验证失败时done(null, false, {message: '用户名密码错误,请重试'})
关于验证方法 passport.authenticate
app.post('/login', passport.authenticate('local', options));
官方文档:
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里。是一个很好的模块。successFlash/failureFlash:
1. 如果不设置此参数或者为false,那么在其他页面无法获取verify callback方法info参数传入的message信息 2. 如果设置为true,那么在其他页面调用 req.flash() 就可以获取到verify callback方法info里的message信息(使用req.flash需要安装模块connect-flash) 3. 如果设置为字符串,那么在其他页面调用 req.flash() 时,就得到这个字符串,而非infosuccessMessage/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] 里