我在我的反应应用程序中使用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”:“请求中包含的安全令牌无效 . ”,“错误:”:“默认”}
Update: 我忘了将会话令牌复制到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
}
]
}
});``
1 回答
刚刚解决了我的问题 - 我已经在API网关的资源下将OPTIONS方法的授权设置设置为AWS_IAM . 但是,当我的浏览器发送请求时,它会首先向OPTIONS发送一个请求,以检查此请求中没有凭据的某些标头 .
由于我使用IAM授权设置了OPTIONS,因此OPTIONS方法在没有我的凭据的情况下使用此请求针对IAM进行了检查 . 这就是我收到“Missing Authentication Token”的原因 .