<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                雖然基本用法已經能覆蓋一般需求了,但是還是有各種edge case的存在。passport也提供了一些擴展性的功能來應對不同的場景。下面就來講一下。 ## 驗證多個條件 有的時候,在登錄時不但需要驗證用戶名和密碼,還需要驗證一個附加條件,比如Discuz!論壇程序提供的功能: [![20141116005335](https://box.kancloud.cn/2015-09-14_55f69d4cec5fc.jpg)](https://box.kancloud.cn/2015-09-14_55f69d4cec5fc.jpg) 這種情況passport也是支持的。 在配置策略的時候,Strategy接受一個options參數,它包含一個passReqToCallback項,默認為false,設置為true時可以將整個req傳遞給回調函數,這樣在回調里就可以驗證req中帶的所有條件了。示例代碼如下: ~~~ passport.use(new LocalStrategy( ? {passReqToCallback: true}, ? function(req, username, password, done) { ??? // now you can check any req.body.xxx ? } )); ~~~ 這個方法在OAuth驗證中也是支持的。 ## 使用多種驗證策略/匿名登錄驗證 最常見的case是貼吧,我們支持已登錄的用戶發帖,但是對匿名用戶也支持發帖回帖,但對它們屏蔽了一些高級用法。 這里需要用到匿名驗證策略passport-anonymous,它的使用非常簡單,只需要聲明一句就行了: ~~~ passport.use(new AnonymousStrategy()); ~~~ 要實現多種驗證策略,可如下配置: ~~~ var passport = require('passport') ? , LocalStrategy = require('passport-local').Strategy ? , AnonymousStrategy = require('passport-anonymous').Strategy; ? ... passport.use(new LocalStrategy( ? function(username, password, done) { ??? User.findOne({ username: username }, function(err, user) { ????? if (err) { return done(err); } ????? if (!user) { ??????? return done(null, false, { message: '用戶名不存在.' }); ????? } ????? if (!user.validPassword(password)) { ??????? return done(null, false, { message: '密碼不匹配.' }); ????? } ????? return done(null, user); ??? }); ? } )); //匿名登錄認證作為本地認證的fallback passport.use(new AnonymousStrategy()); ... app.get('/', ? passport.authenticate(['local', 'anonymous'], { session: false }), ? function(req, res){ ??? if (req.user) { ????? res.json({ msg: "用戶已登錄"}); ??? } else { ????? res.json({ msg: "用戶以匿名方式登錄"}); ??? } ? }); ~~~ 我們可以看到使用多種驗證策略時,可使用數組來將策略名稱作為參數傳給authenticate方法。 匿名驗證是作為local驗證的fallback而存在,當local驗證不滿足時會調用后面的驗證方法。 理論上講這種調用方法也可用于其它驗證,但不鼓勵這么做,它會讓用戶系統變得極為復雜難以維護。、 最后注意:使用匿名驗證時需要將session設為false,不將匿名用戶信息存儲到session中。 ### 游客登錄驗證 還有一種使用場景是將所有的匿名用戶都視為游客,這樣你可以通過用戶管理頁面來操作所有的游客的信息。 你可以通過passport-anonymous來實現這一點,將所有的匿名用戶都賦予同一個用戶ID,但還有一個passport插件來專門做這件事,那就是[passport-dummy](https://github.com/developmentseed/passport-dummy),它的使用方法如下: ~~~ var passport = require('passport') ? , DummyStrategy = require('passport-dummy').Strategy; // 設置部分 passport.use(new DummyStrategy( ? function(done) { ??? return done(null, {username: 'dummy'}); ? } )); // 路由部分 app.post('/login', ? passport.authenticate('dummy', { failureRedirect: '/login' }), ? function(req, res) { ??? res.redirect('/'); ? }); ~~~ 實際使用中經常需要與其他驗證方法結合起來,比如在上面的多種驗證策略中代替匿名登錄驗證。 ## 在其他Web框架中使用passport 這里要明白,passport只是做登錄驗證的,只是操作session,甚至連驗證都是用戶自己完成,它本身是個很獨立的模塊,但是由于其使用了connect中的一些方法,因此與connect有些耦合。 因此一般的connect-style 的web框架passport都能直接使用,無需適配。 那么要在其它web框架中如Hapi中能使用passport嗎? 回答是理論上能,但不建議直接這么做。一般這樣的框架也應該都有自己的驗證模塊或插件,如果實在不能滿足需求,非要用passport,這里提供一下思路:首先要支持session,然后構造類似express中的req和res,起碼要支持res.session各種操作,以及將http request賦值為req。 這里有[Hapi框架使用passport的教程](http://emptymind.me/user-authentication-with-hapi-passport-and-mongoose/),可以看到非常麻煩, 它本身已經有hapi-auth-cookie和bell模塊用于驗證,所以不必執著于使用passport。 ## 在RESTful API中使用passport RESTful API的驗證分為兩種情況。一種是面向自己app的用戶,其驗證和http驗證一樣。另一種是向第三方提供的API,這種情況下可能每次連接都需要驗證,反而不需要用到session了。passport也支持這樣的做法。 想要每次連接都進行驗證,只需將authenticate方法作為中間件添加到需要驗證的URL里,然后將session設為false: ~~~ app.get('/api/users/me', ? passport.authenticate('basic', { session: false }), ? function(req, res) { ??? res.json({ id: req.user.id, username: req.user.username }); ? }); ~~~ 這樣每次連接都需要經過authenticate,并且不會被記錄在session里。 ## 制作passport插件 passport以插件的形式支持了很多第三方網站和服務的OAuth驗證,但并不是所有的,如果你需要在app中用到第三方的服務,但它們沒有對應的passport插件,你可以用通用的OAuth或其他驗證方法來進行驗證,也可以將它們封裝成passport-x插件。 制作passport插件并不困難,因為它只是對策略的配置部分進行了一些封裝而已,你可以將一個已有的passport插件稍微修改即可。 比如要制作一個OAuth2.0的passport插件,你可以以passport-github為模板,甚至只需要修改它的[strategy.js](https://github.com/jaredhanson/passport-github/blob/master/lib/strategy.js),步驟總結如下: 1. 將所有帶github.com的地址修改為對應的地址; 2. 將github、passport-github修改為你需要的服務的名稱。 沒錯,就是這么簡單! 如果僅僅為自己使用,上面的步驟已經足夠,但你還可以將它們分享出來給別人使用,這需要額外的步驟: 1. 修改example/login,以及readme.md,并測試; 2. 將你的插件發布到Github和npm上; 3. 給passport作者[Jared Hanson](https://github.com/jaredhanson)發郵件,或者到[passport的Github頁面](https://github.com/jaredhanson/passport)上發issue,將插件添加到provider list上。 現在你也是passport的貢獻者了!~ ## 更多的驗證方案 上面我們只是講到了local驗證和OAuth驗證,以及提到了一下anonymous驗證,但實際上passport支持的驗證方法不止這幾種,具體支持的驗證方案可以參見[這個頁面](http://passportjs.org/guide/other-api/)。 在多數時候,我們只需要引入這些實現方案,就可以進行驗證。 這里的驗證方案在我們想向第三方app提供RESTful API時非常有用。 ## 推薦項目 一些學習passport具體實現的Nodejs項目。 * [Hackathon Starter](https://github.com/sahat/hackathon-starter):實現了超過10個第三方服務OAuth登錄驗證。 * [nodeclub](https://github.com/cnodejs/nodeclub/):實現Github OAuth驗證。 ## 參考鏈接 * [passport官方文檔](http://passportjs.org/guide/):本文的覆蓋面已超過官方文檔。 * [Express結合Passport實現登陸認證](http://blog.fens.me/nodejs-express-passport/ "Express結合Passport實現登陸認證")?:張丹博客,基本用法,有完整示例 * [Passport實現社交網絡OAuth登陸](http://blog.fens.me/nodejs-oauth-passport/):張丹博客,基本用法,有Github和LinkedIn示例 * [用NodeJS完成簡單的身份驗證](http://www.zhanxin.info/nodejs/2013-10-16-simple-authentication-in-nodejs.html):一篇譯文,包括local驗證和Github示例 * [NodeCoffee實錄 – 登錄認證](http://www.ituring.com.cn/article/56279):用CoffeeScript寫passport示例 * [OAuth 2和passport框架](http://www.moye.me/2014/10/01/oauth-2-0%E5%92%8Cpassport/):講OAuth2.0原理和passport基本示例
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看