2016-03-08 77 views
4

我有两个应用程序,都在Nodejs上。一个前端和其他后端。 我的后端应用程序受到使用express-jwt和jsonwebtoken中间件的令牌访问的保护。当res.redirect找不到授权令牌

我的问题是:我正在从前端向通过标头上的令牌的后端请求,后端接受请求并正确响应。然后在前端我重定向到一个特定页面的响应(res.redirect(“/”)),在那一刻我的错误UnauthorizedError:没有授权令牌被发现

我前端请求:

/* 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

发现问题。

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

  1. 一个作为真正的请求应用程序正在做。
  2. 该请求验证登录前端的用户以确保该用户存在。

此更新(第二点)未提供令牌。

1

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

为了解决这个问题,你有两个选择:

1.传中,URI
令牌可以发出与该URL以这种方式传递的令牌重定向:

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

2.将重定向前标题
可以使重定向请求之前设置'Authorization'头:

req.session.access_token = global.token; 
+0

重定向(通过res.redirect)发出一个新的HTTP请求,同意。但是res.redirect是在前端完成的,这意味着* res *对象来自前端。我的理解是它不应该再次调用后端。此外,我已经尝试了第二个选项将标记再次放在* req *对象中,但是在标头参数中,而不是在会话中。它没有工作。 –

+0

是否因为这两个应用程序都在localhost中? (但在不同的端口上) –