如何将 API 网关与 Cognito 联合身份和 Cognito 用户池集成
How to integrate API Gateway with Cognito Federated Identity and Cognito User Pools
在 AWS 中,我构建了一个调用 Lambda 函数的 API 网关。用户通过登录与 Cognito 联合身份池关联的 Cognito 用户池获得访问权限,并且关联的 IAM 角色包含 API 调用权限。 API 网关方法是一个 POST 请求。
如果我使用用户池作为 API 网关的授权方,我能够通过我的 javascript 网络应用程序中的 ajax 请求成功触发 Lambda 函数 - 注意但是,这会为池中的每个用户授予相同的访问权限。我正在尝试为不同的方法创建不同的基于 Cognito 用户组的访问权限,因为在使用 Cognito 用户池作为授权方时我显然无法为每种方法指定不同的用户组,我现在正在查看是否可以保护 API 使用 AWS_IAM 作为 API 授权人。但是,如果我 select AWS_IAM 作为授权人,我会返回:
请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许访问 Origin 'null'。响应具有 HTTP 状态代码 403。
可能是什么问题?我如何针对这种情况正确设置 CORS,我的 ajax 请求在客户端 javascript 中应该是什么样子? cognito 会为我签名还是我需要对 headers 做些什么?
当我使用 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 网关的授权时,我是否需要更改它?
这里的问题是,当您更改为使用 AWS_IAM
作为 API 网关方法的授权方时,请求现在必须包含特定的亚马逊 header,而不仅仅是 Authorization
header 如您所指定。
这称为签名的 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 网关将验证令牌的真实性,因此您可以依赖它包含的值。然后在 API 网关中,您可以访问此详细信息。
在 AWS 中,我构建了一个调用 Lambda 函数的 API 网关。用户通过登录与 Cognito 联合身份池关联的 Cognito 用户池获得访问权限,并且关联的 IAM 角色包含 API 调用权限。 API 网关方法是一个 POST 请求。
如果我使用用户池作为 API 网关的授权方,我能够通过我的 javascript 网络应用程序中的 ajax 请求成功触发 Lambda 函数 - 注意但是,这会为池中的每个用户授予相同的访问权限。我正在尝试为不同的方法创建不同的基于 Cognito 用户组的访问权限,因为在使用 Cognito 用户池作为授权方时我显然无法为每种方法指定不同的用户组,我现在正在查看是否可以保护 API 使用 AWS_IAM 作为 API 授权人。但是,如果我 select AWS_IAM 作为授权人,我会返回:
请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许访问 Origin 'null'。响应具有 HTTP 状态代码 403。
可能是什么问题?我如何针对这种情况正确设置 CORS,我的 ajax 请求在客户端 javascript 中应该是什么样子? cognito 会为我签名还是我需要对 headers 做些什么?
当我使用 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 网关的授权时,我是否需要更改它?
这里的问题是,当您更改为使用 AWS_IAM
作为 API 网关方法的授权方时,请求现在必须包含特定的亚马逊 header,而不仅仅是 Authorization
header 如您所指定。
这称为签名的 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 网关将验证令牌的真实性,因此您可以依赖它包含的值。然后在 API 网关中,您可以访问此详细信息。