我正在使用AWS API Gateway,我正在使用angular 2代码调用我的API,问题是当会话令牌到期并且我的UI代码尝试使用它时 - API网关会抛出403错误说明"请求中包含的安全令牌已过期" ..这是我在控制台中可以看到的 - 网络部分。
现在这个403错误被捕获在Promise代码=> catch Handler我尝试显示服务器发送的消息,即
{"message":"The security token included in the request is expired"}
这就是问题 - 我无法在控制台和Sweet Alert Box中显示正确的错误消息。
在显示Catch Handler接收的错误对象时,会显示此Json - 实际的错误对象不存在。
{"data":"","status":0,"statusText":"","headers":{},"config":{"method":"GET","headers":{"x-api-key":"<api-key>","Accept":"application/json","x-amz-date":"201705957Z","Authorization":"AWS4-HM256 Credential=ASIAJ66A/20170317/us-west-1/execute-api/aws4_request, SignedHeaders=accept;host;x-amz-date;x-api-key, Signature=59a2bce53fc3fc25a0dcc36c80243ae63","x-amz-security-token":"<security-token>","Content-Type":"application/json"},"timeout":0,"transformRequest":[null],"transformResponse":[null],"url":"https://api.tech.in/adviser/Suraj","data":""}}
我能够解决这个问题,因为API网关在提供错误的密码或用户名时发送了400错误。
注意:CORS已启用&amp;映射响应和集成有403错误映射错误显示标题有CORS。
怎么做 - 解决这个问题 - 因为catch处理程序中捕获的最终错误对象没有正确的http响应数据
这是我的代码
// this is the final Consumer of the Promise
this.http.getFundDetailedList() //***
.then(response => this.fundDetailsList = response.data.Items)
.catch(err => {
swal('Error Reported', "Please login again \n"+err.data, 'error');
console.log(this.handleError(err));
});
}
// helper function for Error Handling
private handleError(error: Response | any) {
let errMsg: string;
console.log('Error Json '+ JSON.stringify(error)); // Wrong Error Object shown in console
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : JSON.stringify(error.data.message);
}
return errMsg;
}
// Calls AWS API - coded inside a http service class
getFundDetailedList() {
return this.credentialService.getAwsSDK().adviserFundsGet({ 'adviser': this.credentialService.$id }, {}, {});
}
答案 0 :(得分:2)
对于API网关中的身份验证失败,未正确发送CORS标头。这是一个已知问题,您可以在aws论坛上找到更多详细信息
https://forums.aws.amazon.com/thread.jspa?messageID=671237򰀷
基本上,对于某些类型的错误(身份验证失败/错误请求/ api密钥身份验证/调用集成),会跳过标头映射,这意味着响应中不会返回CORS标头。
对于给您带来的不便,我们深表歉意。但我们正在积极努力解决这个问题。