登录成功后重定向express js路由

Posted

技术标签:

【中文标题】登录成功后重定向express js路由【英文标题】:Redirect express js route after a successful login 【发布时间】:2021-11-08 19:02:51 【问题描述】:

我正在开发 express js 应用程序,第一页是登录/注册页面。在login.js 中我使用了passportJWT 对用户进行身份验证并将成功登录的用户重定向到应用程序的主页:

function login(req, res, next)
    User.forge( email: req.body.email ).fetch().then(result => 
        if (!result) 
            return res.status(401).send('user not found');
        
        result.authenticate(req.body.password).then(user => 
            const payload =  id: user.id ;
            const token = jwt.sign(payload, process.env.SECRET_OR_KEY);
            console.log(res.statusCode); // just for testing
            res.redirect('/mypage');         
        ).catch(err => 
            return res.status(401).send( err: err );
        );
    );

对于mypage路线我有快递

app.get('/mypage', (req, res) => 
        res.sendFile(path.join(__dirname + '/view/mypage.html'));
    

);

它可以工作,但问题是甚至没有登录用户可以通过localhost:PORT/mypage访问该路由。

首先,重定向到另一条路线是要走的路吗?成功登录后重定向到另一个呈现页面的最佳和适当的方法是什么?

【问题讨论】:

如果人们可以绕过身份验证 - 您需要检查是否在实际请求的标头中找到令牌 - 如果没有 - 将他们重定向到登录.. 像 const token = req.headers['authorization']; 这样的东西然后快速比较如果他们匹配会为你工作 我给你的例子有什么好处吗? 是的,谢谢 不客气 - 在这种情况下,您可能会考虑也接受答案,以防将来的访问者遇到类似问题;) 【参考方案1】:

添加一个中间件保护,检查请求是否在其标头中实际包含令牌。

这是一个通用示例:

/* ================================================
  INFO: @MIDDLEWARE - Used to grab user's token from headers
  ================================================ */

  router.use((req, res, next) => 
    // INFO: Getting the generated token from headers
    const token = req.headers['authorization']; // Create token found in headers
    // INFO: Check if token was found in headers
    if (!token) 
       let content = 
            `<body style="margin: 0px;">
            <div style="width: -webkit-fill-available; height: -webkit-fill-available;">
              <div class="col-sm-12 " style="padding-top: 1em; padding-left: 1em;">
                <h3 style="color:#666666;">Direct navigation via the browser's URL-bar forbidden!</h3>
                <p style="color:#666666;">Please use the navigation provided by the application only.</p>
                <a style="color:#800101; text-decoration:none; font-weight:bold;" href="http://$stdoutIP" target="_self">Back to Login</a>
              </div>
            </div>
            </body>`;
        res.send(content);
    
    else 
      // INFO: Verify the token is valid
      jwt.verify(token, "myVerySecretSecret", (err, decoded) => 
          // INFO: Check if error is expired or invalid
          //console.log("token verification:",token);

          if (err) 
            // INFO: Return error for token validation
            res.json( success: false, message: 'Token invalid: ' + err );
           else 
            // INFO: Create global variable to use in any request beyond
            req.decoded = decoded;
            // INFO: Exit middleware
            next();
          
        );
      
  );

【讨论】:

以上是关于登录成功后重定向express js路由的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器 - 登录后重定向

反应路由器 - 登录后重定向

PayPal Express Checkout 后重定向父页面

成功登录后推送(重定向)到路由

Vue.js 路由在身份验证检查后重定向之前短暂显示 404 错误消息

laravel 5.2 登录后重定向到预期的网址