Angular HTTP Request to NodeJS API中的标头

时间:2017-11-08 14:22:58

标签: node.js angular token

我无法使用我的Angular应用程序在HTTPs请求中发送标头。我必须发送一个令牌来授权我的后端是一个NodeJS API的请求。检查每条路线。

当我打印请求标题时:

host: 'localhost:21124',
connection: 'keep-alive',
'access-control-request-method': 'GET',
origin: 'http://localhost:4200',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36',
'access-control-request-headers': 'authorization,content-type',
accept: '*/*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'pt,en-US;q=0.9,en;q=0.8' }

我使用“授权”控制标头发送我的令牌。
这是我的CORS和valitation( API ):

app.use(helmet());
app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});
app.use(function (req, res, next) {
    if (req.url !== '/login') {
        var token = req.headers['Authorization'];
        if (!token) {
            res.status(401).send('Token não provido!')
        } else {
            jwt.verify(token, SECRET, function(err, decoded) {
            if (err) {
                res.status(500).send('Token inválido!');
            } else if (decoded) {
                var date = new Date();
            if (decoded.exp < date.getTime()) {
                next();
            } else {
                res.status(500).send('Token inválido!');
            }
          }
        });
      }
    } else {
        next();
    }
});

这是我的Angular API服务,我在其中执行请求(例如一个请求):

getAssociados(idClube: string): any {
   const token = localStorage.getItem('token');
   const headers = new Headers({ 'Content-Type': 'application/json', 'Authorization': token });
   const options = new RequestOptions({ headers: headers });
   return this.http.get(this.associadoUrl + idClube, options)
      .map(res => res.json());

}

我已经使用Postman进行了请求。一切都很好。我在Angular应用程序中得到了错误(未经授权)。

1 个答案:

答案 0 :(得分:1)

根据discussion of cross-origin,如果您发送

Access-Control-Allow-Origin: *

然后没有发送任何授权信息。您需要更改node.js应用,以发送明确提及您获得的access-control-allow-origin标头的origin标头。

此外,请注意options预检请求不包含authorization标头;仅在浏览器验证跨源请求后发送。