如何将用户redirect到需要访问令牌的页面,而不在URL查询中显示令牌

我试图实现一种只允许授权pipe理员在我的Web App / API中访问包含敏感信息的页面的方法。 我目前正在使用Node.JS和Express来处理路由。 使用Jade / Pug View Engine生成视图。 使用github上的请求框架处理CORS请求。 ( https://github.com/request/request )

目前,客户端存储在一个MongoDB集合中。 当他们input他们的login信息时,他们的密码与存储在数据库中的哈希进行比较。 如果所有内容都检出,则为用户生成一个JWT并保存在客户端数据库中,并存储在浏览器的localStorage.token

然后用户被redirect到具有authenticationfunction的初始页面作为中间件。 身份validationfunction以三种forms接受令牌:

var token = req.body.token || req.query.token || req.headers['x-access-token'];

我觉得redirect的处理方式有点怪异。 我正在使用window.location = route?token = [token]

令牌被移交给req.query.token中的authenticationfunction,但是这在URL中被公开。 这是我的loginfunction:

 function submitLogIn() { var credentials = { email: logInForm.userEmail.value, password: logInForm.pwField.value } fetch('/login', { headers:{ 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify(credentials) }).then(function(res){ if(!res.ok) alert("Error!") else return res.json().then(function(result){ localStorage.token = result.token; //This is how I'm doing redirecting: window.location = '/selection?token=' + result.token; }).catch(function(err){ console.log(err); throw err; }); }); 

仅供参考,它是端口3001的前端路由,将其作为反向代理请求转换为3000:

 router.post('/login', function(req, res, next) { request.post({ url: 'http://localhost:3000/authorize', form: req.body }).pipe(res) }); 

我的主要问题是:我如何处理在获取调用的前端redirect?

我的启animation面基本上是一个button菜单,将把用户带到不同的页面。 这些页面将包含只有pipe理员应该看到的信息。 比方说,我想点击这个导航button。 它转到一个/ GET路由,要求将令牌发送到OK状态。 如果没有令牌,则返回403。

 router.get('/main', authorize.adminRequired, function(req, res, next) { request.get({ url: 'http://localhost:3000/menus' }, function(response, sensitiveItems) { return res.render('index', {menu: JSON.parse(sensitiveItems)}); }); }); 

authorize.adminRequired函数需要查询,x-access-token或req.bodyforms的标记。 无法在GET请求中发送正文。 不想在URL中公开,所以:

这是我的尝试。 我有这个redirect获取调用作为onclick函数。

 function redirectToSensitivePage() { fetch('/main', { headers: { 'x-access-token': localStorage.token }, method: 'GET' }); }; 

这给了我200,好的。 但是我不加载页面。 路由中的res.render(index)不会触发。 响应确实包含了所有的数据,但是我没有被redirect到视觉表示。

我可以使用window.location = / main?token = [token]来做同样的hackyredirect,但我不想公开URL标记。 我可以在login时将所需的所有内容加载到网页中,而不是单独的页面,直到按键使div成为主可见div时,才将这些div隐藏起来,但我宁愿弄清楚如何通过redirect来做到这一点。

我仍然在使用Node,所以请让我知道,如果我做了任何愚蠢的明显疏忽。

编辑:我应该只是尝试

var token = localStorage.token || req.body.token || req.query.token || req.headers['x-access-token'];

是否有任何缺点,只是从每个请求自动从本地存储刮取?