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() 持续存在