2016-03-08 135 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中? (但在不同的端口上) –