passport.js學習筆記
http://idlelife.org/archives/808 php
Express結合Passport實現登錄認證
http://blog.fens.me/nodejs-express-passport/ node
官方文檔
http://passportjs.org/docs git
# 方法一 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: '登陸失敗'}); } );
官方文檔: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: '用戶名密碼錯誤,請重試'})
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] 裏