2016-06-12 108 views
1

我有一個應用程序使用與護照捆綁在一起的所有oAuth身份驗證,但我正在使用外部服務來創建數據庫/用戶。是否有可能在沒有本地數據庫的情況下使用PassportJS?

如果我做這樣的事情:

passport.use('local-signup', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true  }, 
    function(req, username, password, done) { 

     request.post('http://myapiservice.com/createuser').then(function(err, response, body){ 
      return done(err, body.user); 
     }) 

    })) 

我將如何使用遠程存儲的用戶與此?我沒有以任何方式連接到數據庫,除了POST API調用創建用戶和獲取用戶的GET調用之外,所以我不確定Express'req.user將如何表現/更新。

在別處找不到關於此的單個指南或問題,因此會喜歡一點指導!

回答

2

req.user將由您通過調用done回調策略的「返回」作爲第二個參數填充。在你的示例代碼中,那將是body.user

這是完全合法的,無論你想要的方式對用戶進行認證,並且您的代碼示例似乎很合法的(前提是你不是故意創建從戰略回調用戶,但使用驗證一個遠程API(見下面的解釋))。

需要考慮的一件事是策略回調不是用戶數據「查找」的唯一地方,這也發生在passport.deserializeUser()回調中,該回調會針對您要驗證的每條路由調用。

這取決於您要在會話中存儲多少用戶信息(這是serializeUser()所做的)。存儲更多信息意味着您不必爲deserializeUser()調用遠程API,但這也意味着本地存儲的(在會話中)用戶數據可能與遠程API不同步(如果發生這種情況)。

編輯:關於在策略回調中創建用戶:這不是非法的,但它取決於策略類型(如果推薦的話)。

對於實施遠程服務身份驗證的策略(如passport-facebook),通常從策略回調中創建或更新用戶,因爲這是從遠程服務接收信息的唯一入口點。

但是,在您的情況以及passport-local一般情況下,您應該只使用策略回調進行身份驗證,因爲您無法始終訪問創建新用戶所需的所有用戶信息。

最好創建一個單獨的Express路由,發佈創建用戶表單,這將負責創建用戶(無論是在本地數據庫還是遠程服務,就像您的情況一樣)。

+0

I * do *想要用上面的代碼片段中的請求POST創建一個用戶。這不可能嗎?有沒有什麼特別的我可以用'express-session'來做持久性登錄工作? – Jascination

+0

@Jascination我編輯了我的答案來解釋更多關於創建用戶的信息。隨意忽略我,但沒有什麼是在這裏設置= D – robertklep

+0

感謝澄清。最後一件事,如果我不使用策略回調來創建一個用戶,那麼我該怎麼回傳給'done(err,user)'? – Jascination

相關問題