nodejs认证模块passport.js passport-local用法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

基本用法可参考以下文章:

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

转载于:https://my.oschina.net/yangq20/blog/856026

你可能感兴趣的:(javascript,python,php,ViewUI)