如何做到用户只有在登录时才能访问某些路由?

Posted

技术标签:

【中文标题】如何做到用户只有在登录时才能访问某些路由?【英文标题】:How to do that an user has access to certain routes only when logged in? 【发布时间】:2021-08-28 15:06:37 【问题描述】:

我已经用谷歌登录,效果很好。其中,登录完成后,我返回一个存储在 localStorage 中的 jwt。

const data = id_token;

fetch(url, 
    method: 'POST',
    body: JSON.stringify(data),
    headers:
      'Content-Type': 'application/json'
    
  )
  .then(resp => resp.json())
  .then((jwt) => 

      if (jwt) 
        localStorage.setItem('x-token', jwt);
      


  )
  .catch(error => console.error('Error:', error))

我如何才能让用户只有在获得该令牌并且该令牌为真时才能访问某些路由?因为他可以将任何数据存储在导航器中 localStorage 的变量“x-token”中,这样​​他就可以访问任何路线。

在邮递员上,jwt 的验证工作正常,用户只有在将令牌放入“req.header”时才能访问某些路由。现在,我如何在导航器中执行相同的操作?

const validateJwt = (req, res, next) => 

let token = req.header('x-token')

//If the header is not empty, then validate the header and the token.
if (!token) 
    res.status(400).json(
        msg: 'Token doesn´t exists'
    )

else

    jsonwebtoken.verify(token, process.env.SECRETORPRIVATEKEY, (err, decoded) => 

        if (err) 
            res.status(403).json(
                msg: 'Token no valid'
            )

        else
            next();
        

    );    
     

【问题讨论】:

app.use('/protected',validateJwt(req,res,next), function (req,res,next) //只有jwt验证通过才会调用这个函数。) ; 是的,但我如何设置要在 req.header 中接收的标头? 在你的获取选项参数headers: Authorization: "Bearer <JWT token>" 中设置这个@ 在服务器上let token = req.headers.authorization.split(' ')[1] 【参考方案1】:

这是middlewares 的一个很好的用例。如果您希望在控制通过特定方法到达您的路径之一但在主路径处理程序函数之前运行一个函数,您可以使用中间件。它们适用于日志记录、验证、解析等。 你已经有了你的 validateJwt 函数,把它放在你的路由之后:

app.use('/auth',
validateJwt(req,res,next),
 (req,res,next) => 

); 

【讨论】:

是的,我做到了。但是我如何从导航器中调用 req.header ??? 导航器是什么意思?无论如何,req.header(HEADERNAME) 或 req.headers() 不起作用吗? 是的,我如何发送 req.header?它位于哪里? 您可以在发送请求时使用它Headers.set 它没有用。我想用 JWT 设置一个 header,然后用 req.header 接收它以传递中间件。在邮递员中有一个部分可以设置任何名称的标题。我想在导航器中做同样的事情。

以上是关于如何做到用户只有在登录时才能访问某些路由?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 API + React + Google login:登录后如何授权用户访问某些服务器路由?

检查 Liferay 管理员用户登录

Laravel with JWT - 如何为只有在未经身份验证的情况下才能看到的路由创建路由组

只有在登录状态才能访问用户中心页面 | Django开发

页面刷新后如何保持用户登录

如何在网站访问期间找到用户的位置?