2016-04-07 47 views
0

這個問題有一半是關於我的代碼的具體問題,一半是關於實際從節點API獲取特定用戶數據的高級視圖。基於Node/Express中的JWT爲用戶獲取數據

所以我有用戶註冊/登錄所有工作正常,並可以說我有用戶和小部件之間的一對多映射,所以每個用戶可以從他或她的個人資料頁創建和刪除小部件。

因此,這裏有我的數據庫模型:

var User = new mongoose.Schema({ 
    email: { 
    type: String, 
    unique: true, 
    required: true 
    }, 
    hash: String, 
    salt: String 
    widgets : [{ type: Schema.Types.ObjectId, 
      ref: 'widget' 
      }], 
}); 

var Widget = new mongoose.Schema({ 
    name   : String, 
    type   : String, 
    description : String, 
}); 

在用戶登錄過程中,我產生JWT和使用,以節省前端的授權頭。

現在我的問題是雙重的。 1)我如何正確保存小部件,以便它們與當前登錄的用戶相關聯?和2)如何獲取與用戶關聯的所有小部件?

我最初的想法是這樣的:

app.get('api/widgets', function(req, res, next){ 
    // decode authorization header to get user email 
    // run database query to return all widgets associated with user email 
}); 

app.post('api/widgets', function(req, res, next){ 
    // decode authorization header to get user email 
    // create widget and update user with widget ID 
}); 

這是正確的想法?如果是這樣,我將如何去解碼授權標題以獲取用戶的電子郵件?我是否需要對與用戶關聯的每個對象都進行相同的過程?或者在Node/Express中有更快,更方便的方法嗎?

+0

是的,你可以存儲用戶數據的小部件在智威湯遜,但需要更新後,每添加/刪除插件運行,這將需要額外的邏輯來新智威湯遜與客戶端同步。最簡單的方法是使用會話。 – alexmac

+0

對不起,我不確定在原始問題中是否清楚。我不想將小部件數據存儲在JWT中。我只是將用戶電子郵件存儲在JWT中。通過'用小部件ID更新用戶',我的意思是用小部件ID更新數據庫中的用戶。 – jmknoll

+0

我認爲這是正確的方法。如果你使用一些庫來編碼jwt token,那麼它最有可能也有一些解碼功能。要保存小部件,只需使用小部件模型'new Widget({name ....})的保存功能。save(function(err,widget){更新用戶在這裏使用$ push operator})'然後獲取用戶使用的小部件'User.findOne(id).populate('widgets')。exec(function(err,user){用戶在這裏將有一個小部件數組,不是id,而是來自widget集合的實際對象});' – Molda

回答

2

這是正確的想法嗎?

在我看來,這是正確的。

如果是這樣,我將如何解碼授權標題以獲取用戶的電子郵件?

如果您使用的是jsonwebtoken包,則有一個verify解碼令牌的方法。您甚至可以將多個值存儲在單個令牌中,如電子郵件和名稱。 verify會將令牌解碼爲具有兩個屬性的對象。

我是否需要對與用戶關聯的每個對象都經歷相同的過程?或者在Node/Express中有更快,更方便的方法嗎?

在每個請求中加載這些對象可能是最常用的方法。如果您發現此加載過程正在減慢您的應用程序,則可以使用node-cacheRedis(建議在擁有分佈式應用程序集羣時)將其緩存。

我還建議,不要在每條路線上將用戶的令牌解碼爲電子郵件,而是使用catch all route解碼令牌並存儲在locals中。幹!

app.use(function (req, res, next) { 
    var token = req.signedCookies.token 
    res.locals.user = jwt.verify(token, 'my-secret') 
    next() 
}) 
+0

謝謝。這非常有幫助。 – jmknoll