nodejs认证模块passport.js参数解释

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

passport.js学习笔记
http://idlelife.org/archives/808 php

Express结合Passport实现登录认证
http://blog.fens.me/nodejs-express-passport/ node

官方文档
http://passportjs.org/docs git


关于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 github

# 源码里关于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: 'zhang.san@example.com'};
done(null, user)

# 验证失败时
done(null, false, {message: '用户名密码错误,请重试'})



关于验证方法 passport.authenticate

app.post('/login', passport.authenticate('local', options));

官方文档:http://passportjs.org/docs/authenticate 数据库

options参数解释以下: express

session: 默认true,是否将用户的登陆状态记录到session,通常无需修改此选项,若是设置为false,那么一旦页面跳转,浏览器没法得知你的登陆状态,这个选项应该是用于RESTful API之类的程序用的,由于这类程序每次请求都会须要验证 浏览器

successRedirect: 若是登陆成功那么就会跳转到指定页面,若是没指定,至关于执行了next() session

failureRedirect:若是登陆失败,则会跳转到指定页面,若是没有指定,页面会抛出一个401 Unauthorized错误 app

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

相关文章
相关标签/搜索