res.redirect 时未找到授权令牌

Posted

技术标签:

【中文标题】res.redirect 时未找到授权令牌【英文标题】:No authorization token was found when res.redirect 【发布时间】:2016-06-22 08:22:16 【问题描述】:

我有两个应用程序,都在 Nodejs 上。一个前端,一个后端。 我的后端应用程序通过使用 express-jwt 和 jsonwebtoken 中间件的令牌访问受到保护。

我的问题是:我正在从前端向后端发出请求,通过标头上的令牌,后端接受请求并正确响应。然后在前端我将响应重定向到特定页面 (res.redirect('/')),在那一刻我收到错误 UnauthorizedError: No authorization token被发现了

我的前端请求:

/* Authentication */
router.post('/', function(req, res, next) 

    // request login service
    request(
        uri: env.getUrl() + "/user",
        method: 'POST',
        timeout: 10000,
        headers: 
            'Authorization': 'Bearer '.concat(global.token)
        ,
        form:  login : req.body.login, pwd : req.body.pwd 
    , function(error, response, body)
        if(error) 
            logger.error(error);
            res.render("error", message: "Error getting user" ); 
        
        else 
            if(body)
                req.session.usuario = JSON.parse(body);
                res.redirect("/");
             else 
                res.render("login", message: "Login Failed" );
            
        
    );
);

我不知道为什么会这样。你可以帮帮我吗? 提前致谢。

【问题讨论】:

【参考方案1】:

重定向(通过res.redirect)发出一个新的HTTP 请求。这意味着Authorization 标头为空。这会导致 UnauthorizedError 错误。

要解决此问题,您有两种选择:

1.在 URI 中传递令牌 您可以通过这种方式使用 URL 中传递的令牌发出重定向:

res.redirect("/?access_token=" + global.token);

2。在重定向前设置标题 您可以在发出重定向请求之前设置'Authorization' 标头:

req.session.access_token = global.token;

【讨论】:

重定向(通过 res.redirect)发出一个新的 HTTP 请求,同意。但是 res.redirect 是在前端完成的,这意味着 res 对象来自前端。我的理解是它不应该再次调用后端。此外,我尝试了第二个选项,将令牌再次放入 req 对象中,但放入 headers 参数中,而不是会话中。它没有用。 会不会是因为两个应用程序都在本地主机中? (但在不同的端口上)【参考方案2】:

发现问题。

每当我的前端应用程序向后端 (api) 发出请求时,登录前端的用户都会针对后端进行验证,因此前端的会话也会更新。这意味着每个请求实际上是两个请求:

    一个作为应用程序正在执行的真正请求。 验证用户登录前端的请求,以确保用户存在。

此更新(第二点)是在未提供令牌的情况下进行的。

【讨论】:

以上是关于res.redirect 时未找到授权令牌的主要内容,如果未能解决你的问题,请参考以下文章

错误:使用 rs_create_table 时未找到 AWS 会话令牌

尝试访问我的 api 平台时未找到 JWT 令牌 401 错误?

Axios Intercept 在第一次调用时未从 localStorage 应用令牌

Node.js - 会话不会通过 res.redirect() 持续存在

在 asp.net 核心中使用身份时未找到具有授权属性的操作

使用 Redis 检查每个请求的访问令牌