我无法使用我的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应用程序中得到了错误(未经授权)。
答案 0 :(得分:1)
根据discussion of cross-origin,如果您发送
Access-Control-Allow-Origin: *
然后没有发送任何授权信息。您需要更改node.js应用,以发送明确提及您获得的access-control-allow-origin
标头的origin
标头。
此外,请注意options
预检请求不包含authorization
标头;仅在浏览器验证跨源请求后发送。