2017-01-28 28 views
1

我想建立一個使用JWT的無狀態API。我在我的路由器中有一箇中間件功能,用於檢查JWT是否已過期,如果有,則會隨即生成帶有新時間戳的新令牌。表示多個res.json();與中間件

我想傳遞新的令牌以及JSON對象中的響應。我目前的做法是這樣的,但它當然不起作用:

router.use(function (req, res, next) { 
    // JWT Expired 
    // Generate new JWT 
    res.write(JSON.stringify({token: token}); 
    next(); 
}); 


router.get('/securedRoute' function(req, res) { 
    // Fetch data 
    res.json({data: data}); 
}); 

// Output should be: 
{token: 'erg34jlkgjre.3f4fknlj.34f3', data: ['sdfa', 'sdf']} 

這將是很好找出路,在那裏我沒有改變所有的我現有的代碼並檢查是否有新的令牌。

感謝您的幫助!

+0

這可能是一個愚蠢的問題,但是如果你打算設置一個新的令牌,你會發現一個過期的令牌,爲什麼不關掉令牌過期? – Paul

回答

1

一個選項將在response標頭中添加授權令牌:

router.use((request, response, next) => { 
    response.setHeader('Token', token); 

    next(); 
}); 

router.get('/securedRoute', (request, response) => { 
    response.json({ data: data }); 
}); 

或者,您可以隨時將令牌添加到request,然後有條件地將request.token添加到您的所有路由中,如前面提供的答案。不幸的是,這意味着你需要修改所有的路線。


作爲替代方案,你可以重寫response.json方法和手動如果它存在注入的令牌。這樣做,你不需要修改你的任何路線。

router.use((request, response, next) => { 
    request.token = token; 

    ((proxied) => { 
    response.json = function (data) { 
     if (request && request.token) { 
     data.token = request.token; 
     } 

     return proxied.call(this, data); 
    }; 
    })(response.json); 

    next(); 
}); 

router.get('/securedRoute', (request, response) => { 
    response.json({ data: data }); 
}); 

在上面的例子中,response.json方法在中間件覆蓋。這是通過傳遞舊的response.json方法的引用,然後在有條件地將令牌注入有效負載後調用它來完成的。

0

答案是假設你想實現的是在同樣的方法

而不是中間件寫令牌像做

(req,res,next)=>{ 
    req.token = newToken; 
    next(); 
} 

而在你的路線

res.json(req.token ? {token:req.token,data:data} : {data:data}); 
+0

這是一種可能性,但這需要我改變迄今爲止設置的每一條路線。 但也許這是我唯一的選擇 –

+0

好了這裏是一個更好的方法,然後,只需更改中間件並設置授權標頭。它不會與你在路由中的代碼衝突,你只需要在你的客戶端js上檢查標題的句柄 – georoot

+0

也可以看看https://auth0.com/blog/refresh-tokens-什麼是他們什麼時候使用他們/ – georoot