在AWS中,我建立了一个API网关,该网关调用Lambda函数。用户通过登录与Cognito联合身份池关联的Cognito用户池来获得访问权限,并且关联的IAM角色包含API调用权限。 API网关方法是一个POST请求。
如果我将用户池用作API网关的授权者,则可以通过我的javascript网络应用中的ajax请求成功触发Lambda函数-但是请注意,这将向池中的每个用户授予相同的访问权限。我正在尝试为不同的方法创建不同的基于Cognito用户组的访问权限,并且由于在使用Cognito用户池作为授权方时显然无法为每个方法指定不同的用户组,因此我现在是否可以使用AWS_IAM来保护API API授权者。但是,如果我选择AWS_IAM作为授权者,则会返回:
所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问原始“空”。响应的HTTP状态代码为403。
可能是什么问题?在这种情况下,如何正确设置CORS?我的ajax请求在客户端JavaScript中应该是什么样的? Cognito是否会为我签名,还是我需要对标题做些事情?
使用Cognito用户池时,我拥有:
$.ajax({
method: 'POST',
url: _config.api.invokeUrl + '/savesurv',
headers: {
Authorization: authToken
},
data: JSON.stringify(Data),
contentType: 'application/json',
success: callback,//console.log("complete"),
error: function ajaxError(jqXHR, textStatus, errorThrown) {
console.error('Error requesting save: ', textStatus, ', Details: ', errorThrown);
console.error('Response: ', jqXHR.responseText);
alert('An error occured when requesting to save:\n' + jqXHR.responseText);
}
});
在这种情况下可以使用,在使用AWS_IAM作为API网关的授权时是否需要更改它?
答案 0 :(得分:1)
这里的问题是,当您更改为使用AWS_IAM
作为API网关方法的授权者时,请求现在必须包含特定的Amazon标头,而不仅仅是您指定的Authorization
标头。
这被称为签名的Sigv4请求,有关如何创建该请求的更多信息,请参见:
https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html
因此,要回答您的问题,Cognito将不会处理签名,您确实需要执行其他步骤,或者获得一个框架来为您处理。
让我工作的方法是使用Amplify(https://aws-amplify.github.io/)生成我的API请求,该框架将为您签名请求。
我很欣赏这是一个高水平的答案,但是在这里进入Amplify可能会有点离题。
值得注意的是,如果您使用https://jwt.io/之类的工具解码JWT ID令牌(作为authToken
传递的令牌),则会包含用户所在组的详细信息可能会给您一些帮助。我假设API Gateway会验证令牌的真实性,因此您可以依靠其包含的值。然后,您可以在API Gateway中访问此详细信息。