Amazon web services 403 API调用错误,可能存在身份验证问题?
我想哭,我真的想哭。我有这个问题已经三天了。我在aws lambda中有一个POST API,当我在aws lambda或cli中测试它时,它运行良好。但当从我的客户机调用API时就不是了。我得到以下错误Amazon web services 403 API调用错误,可能存在身份验证问题?,amazon-web-services,aws-lambda,amazon-cognito,Amazon Web Services,Aws Lambda,Amazon Cognito,我想哭,我真的想哭。我有这个问题已经三天了。我在aws lambda中有一个POST API,当我在aws lambda或cli中测试它时,它运行良好。但当从我的客户机调用API时就不是了。我得到以下错误POSThttps://sdigg5u4xb.execute-api.eu-west-1.amazonaws.com/prod/sites 403和未捕获(承诺中)错误:请求失败,状态代码403 在createError(createError.js:17) 结算时(结算js:19) 在XMLH
POSThttps://sdigg5u4xb.execute-api.eu-west-1.amazonaws.com/prod/sites 403和未捕获(承诺中)错误:请求失败,状态代码403
在createError(createError.js:17)
结算时(结算js:19)
在XMLHttpRequest.handleLoad(xhr.js:78)
起初我以为这和CORS有关,但事实并非如此。因为它是403错误,所以它必须与权限有关,对吗?
我曾尝试给我的aws用户不同的策略和角色,以允许他们做任何事情,但我无法让它工作。请在我哭之前帮助我。如果有人需要我的aws信息,请询问
Lambda代码:
调用API:
从“aws放大”导入{API}
在my index.js中放大配置
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: "sites",
endpoint: config.apiGateway.URL,
region: config.apiGateway.REGION
},
]
}
});
serverless.yml
functions:
# Defines an HTTP API endpoint that calls the main function in create.js
# - path: url path is /notes
# - method: POST request
# - cors: enabled CORS (Cross-Origin Resource Sharing) for browser cross
# domain api call
# - authorizer: authenticate using the AWS IAM role
createSite:
handler: CreateSite.main
events:
- http:
path: sites
method: post
cors: true
authorizer: aws_iam
看起来您没有在POST请求中发送ID令牌 尝试将此添加到您的通话中:
{
headers: {
Authorization: cognitoUser.getIdToken().getJwtToken()
},
body: values
}
cognitoUser将是您分配给用户的cognitoUser的任何对象名称。看起来您没有随POST请求一起发送ID令牌 尝试将此添加到您的通话中:
{
headers: {
Authorization: cognitoUser.getIdToken().getJwtToken()
},
body: values
}
cognitoUser将是您分配给用户的cognitoUser的任何对象名称。您需要发布Lambda代码。承诺正在返回,但有一个未处理的异常。这可能是权限问题,但除非您处理异常并
console.log
It(登录到Cloudwatch),否则您将无法了解真正的问题。@Annjawn感谢您的回复!我添加了lambda代码。我使用pastebin是因为它相当长,并且希望保持可读性。我们需要您用来调用API的代码。确保您发送的是带有id令牌的授权标头。@我已在调用apiYourauthorizer
isaws\u iam
的地方插入了代码。因此,您需要一个密钥
,访问密钥
和令牌
来根据您的API进行身份验证,而不是Cognito用户池
的jwt
令牌。你是如何认证的?你需要发布你的Lambda代码。承诺正在返回,但有一个未处理的异常。这可能是权限问题,但除非您处理异常并console.log
It(登录到Cloudwatch),否则您将无法了解真正的问题。@Annjawn感谢您的回复!我添加了lambda代码。我使用pastebin是因为它相当长,并且希望保持可读性。我们需要您用来调用API的代码。确保您发送的是带有id令牌的授权标头。@我已在调用apiYourauthorizer
isaws\u iam
的地方插入了代码。因此,您需要一个密钥
,访问密钥
和令牌
来根据您的API进行身份验证,而不是Cognito用户池
的jwt
令牌。您是如何进行身份验证的?我收到错误“cognitoUser未定义”。我应该提到,我的网站还没有登录系统。在此之前,我想让它正常工作,我还从index.js中添加了我的放大配置。有没有办法在api调用中,将用户api键硬编码到头中?好的,那么,您的api是否使用授权程序?它应该在API的方法请求部分。我似乎找不到你在说什么,是在我的代码中还是在aws上?我刚刚在问题中插入了我的代码中定义api的部分,我得到了错误“cognitoUser未定义”。我应该提到,我的网站还没有登录系统。在此之前,我想让它正常工作,我还从index.js中添加了我的放大配置。有没有办法在api调用中,将用户api键硬编码到头中?好的,那么,您的api是否使用授权程序?它应该在API的方法请求部分。我似乎找不到你在说什么,是在我的代码中还是在aws上?我刚刚在问题中插入了定义api的代码部分