我在我的反应应用程序中使用AWS Amplify通过AWS_IAM授权调用我在API网关中托管的API。当我将授权设置为NONE时,我的反应应用程序中的一切正常。
但是,当我将权限设置为AWS_IAM并使用Amplify中的API.get()执行我的API时,如下面的代码:
const notes = await API.get('notes', '/notes', init);
我收到一条错误消息:
{
"message": "Missing Authentication Token",
"err": "missing auth"
}
所以我尝试使用aws-api-gateway-cli-test来测试我的API网关。通过该脚本,我能够获得有效的凭证,获得经过身份验证和正确的响应。我也使用我的管理员凭据尝试了POSTMAN,它也运行良好。
在做了一些研究之后,我看到有人将此称为CORS问题。我已经仔细检查了我的API网关设置并确认我已经启用了CORS。同样的问题仍然存在。
通过aws-amplify的调试功能,我能够在Chrome检查器中看到签名过程。签名过程使用一些accessKey和secretKey正确执行。我将那些钥匙从检查员身上拉进我的POSTMAN并试图得到。 这些凭据无效,我收到以下错误消息:
{
"message": "The security token included in the request is invalid.",
"err:": "default"
}
更新:我忘了将会话令牌复制到POSTMAN中。现在使用我的应用程序生成的所有凭据,我可以从POSTMAN中的API获得正确的结果。只是不在我的应用程序中。
在这一点上,我很明显这是一个auth问题。但是,我一直在使用aws-amplify进行登录和获取进程。很确定签名过程是通过在幕后放大来完成的。
我已经花了3天时间解决这个问题并基本上尝试了所有内容......任何关于它为什么不起作用的想法?
附:很多人都认为调用URL中的拼写错误可能会导致此问题。我有双重检查,没有拼写错误。以下是我的放大配置代码:
``Amplify.configure({
Auth: {
mandatorySignIn: true,
region: config.cognito.REGION,
userPoolId: config.cognito.USER_POOL_ID,
identityPoolId: config.cognito.IDENTITY_POOL_ID,
userPoolWebClientId: config.cognito.APP_CLIENT_ID
},
Storage: {
region: config.s3.REGION,
bucket: config.s3.BUCKET,
identityPoolId: config.cognito.IDENTITY_POOL_ID
},
API: {
endpoints: [
{
name: "notes",
endpoint: config.apiGateway.URL,
region: config.apiGateway.REGION
}
]
}
});``
刚刚解决了我的问题 - 我已经在API网关的资源下将OPTIONS方法的授权设置设置为AWS_IAM。但是,当我的浏览器发送请求时,它会首先向OPTIONS发送一个请求,以检查此请求中没有凭据的某些标头。
由于我使用IAM授权设置了OPTIONS,因此OPTIONS方法在没有我的凭据的情况下使用此请求针对IAM进行了检查。这就是我收到“Missing Authentication Token”的原因。