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

相關文章
相關標籤/搜索