如何将API网关与Cognito联合身份和Cognito用户池集成

时间:2018-09-03 21:52:44

标签: amazon-web-services aws-lambda aws-api-gateway aws-cognito aws-iam

在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网关的授权时是否需要更改它?

1 个答案:

答案 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中访问此详细信息。