我正在尝试创建一个应用程序,用户可以在其中登录,然后可以根据自己的角色访问某些api资源。
用户被移动到用户池中的组中,每个组都有一个自定义IAM角色。
我曾经放大CLI工具来创建身份验证、api网关和lambda函数。这是在放大中建立的API
? Please select from one of the below mentioned services: REST
? Please select the REST API you would want to update standardApi
? What would you like to do Update path
? Please select the path you would want to edit /std
? Provide a path (e.g., /book/{isbn}): /std
? Choose a Lambda source Use a Lambda function already added in the current Ampl
ify project
? Choose the Lambda function to invoke by this path standardFunction
? Restrict API access Yes
? Restrict access by? Individual Groups
? Select groups: standard
? What kind of access do you want for standard users? create, read, update, dele
te
Successfully updated resource
在控制台中进行检查时,会按预期创建资源。
问题是,当试图调用API时,我收到了MissingAuthenticationTokenException
这是呼叫
const apiName = 'standardApi';
const path = '/std';
const myInit = {
headers: {},
response: false
};
API.get(apiName, path, myInit)
.then(response => {
console.log(response);
})
.catch(error => {
console.log(error.response);
});
我的理解是,Amplify sdk应该使用正确的身份验证值自动填充请求标头。
如果我尝试手动传入访问令牌,
headers: {
Authorization: (await Auth.currentSession()).getIdToken().getJwtToken()
},
我得到IncompleteSignatureException,消息为
Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header.
尝试
headers: {
Authorization: `Bearer ${(await Auth.currentSession()).getIdToken().getJwtToken()}
},
导致IncompleteSignatureException,但没有消息。
其他帖子建议,可能没有正确指定端点,如果我从控制台中的api中删除auth并重新部署,端点就会按预期命中。此外,如果我使用cognito用户池创建了一个自定义授权器,那么当登录并传递承载令牌时,端点就会正确命中。
这只是IAM的案例不起作用。
检查ID令牌表明传入了正确的用户名、组和角色
"cognito:groups": Array [ "standard" ]
"cognito:preferred_role": "arn:aws:iam::************:role/region-*_*********-standardGroupRole"
"cognito:roles": Array [ "arn:aws:iam::************:role/region-*_*********-standardGroupRole"]
"cognito:username": "0a******-****-****-****-************"
Amplify配置步骤是使用自动生成的aws导出文件完成的,该文件包含用户池、身份池和客户端应用程序的正确条目。
我知道这可能会有点晚,但我只是想做你想做的事情。
这就是我必须做的让它工作:
- 在UI中包含身份验证组件,以便使用已验证用户的凭据完成API调用
- 请确保在根据Cognito(使用属于指定组的用户(进行身份验证后执行API调用
- 不要包含任何"Authorization"标头(我查看了代码,发现在设置Authorization标头时没有生成AWS签名(
- 确保您的lambda代码返回CORS头(因此,我收到了来自CloudFront的InternalServerErrorException(
这样做,我可以在浏览器的开发人员控制台中看到,请求已签名,并且具有API网关所做的IAM授权验证所需的所有标头。
我希望这个云对某人有用,因为我花了很多时间才弄清楚。
谨致问候,Andres Llanos