亚马逊AWS官方博客

使用 Cognito 与 AWS API Gateway 集成实现 API 级别权限控制

引言:

在文章《使用 Cognito User Pools 快速构建企业级SSO单点登录中心》中我们介绍了如何使用 Cognito User Pools(用户池)快速搭建 SSO 单点登录中心,接下来本文我们将介绍如何通过 Cognito User Pool(用户池)、Identity Pools(身份池) 、IAM 与 AWS API Gateway 的集成实现对系统用户API级的权限管理。

一、阅读本文前提

1. 进行本文示例实验前,请先从请 https://github.com/caoheyang/cognito-wildrydes-website-1 拉取本文实验所需的基础代码,并请确保参照文章《使用 Cognito User Pools 快速构建企业级SSO单点登录中心》2.5 之前部分完成了基本的 Cognito User Pools 创建与配置配置。

2. 了解无服务器API架构(API Gateway、Lambda)。

二、创建Cognito Identity Pools

1.请使用【“应用程序客户端 ID“的值和”池 ID“】创建 Identity Pools,Identity Pools 名称 wildrydeswebapp1,点击“创建池”如图:

接下来将会跳转下如下页面,提示需要创建供 Identity Pools  使用的 IAM 信息,点击“允许”即可。

  1. 打开 src/amplify-config.js 配置 identityPoolId 和 API Gateway 信息。请注意,API Gateway 是在文章《使用 Cognito User Pools快速构建企业级SSO单点登录中心》中使用ServerlessBackend.yaml 通过 CloudFormation 创建的。

三、实现对系统用户API级的权限管理

API Gateway 支持多种用于控制和管理对 API 访问的机制,本文的目标是是实现对Cognito中不同用户的不同API权限控制,主要通过AWS IAM Role + Cognito实现,其他方式请查看https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/apigateway-control-access-to-api.html

为了方便测试,请确保您的API Gateway中的API资源已开用CORS,允许跨域请求。

1.使用Identity Pools默认角色进行用户权限验证

(1)点击编辑“身份池”,查看“身份验证提供商”的配置,确保选择的是“使用默认角色”。

(2)使用npm start启动网站,登录成功后,访问 http://localhost:3000/app ,此时我们尚未给API Gateway中的API开启身份验证,点击Request,此时,网页显示请求成功。

(3)在 Amazon API Gateway 控制台中,将 /ride 资源上的 POST 方法的授权类型更新为 AWS_IAM。 接下来,重新部署 API 以使您的更改生效。

(4)访问 http://localhost:3000/app,此时我们已经给API Gateway中的API开启了基于AWS_IAM 的身份验证,点击Request,网页显示请求失败,原因是 Cognito 中的用户承担的 AWS IAM Role 并没有请求 API Gateway 中 /ride API 资源的权限。

(5)为Cognito_wildrydeswebapp1Auth_Role IAM Role 附加名称为 WildRydesAPI-StandardUserPolicy 的 IAM policy,请注意 WildRydesAPI-StandardUserPolicy 是在文章《使用 Cognito User Pools快速构建企业级SSO单点登录中心》中使用ServerlessBackend.yaml通过CloudFormation创建的,其中包含了请求API Gateway中 /ride API资源的权限。

(6)访问 http://localhost:3000/app ,点击Request,网页显示请求成功。

2.使用Identity Pools令牌角色进行不同用户权限的划分

(1)配置身份池 – 选择的“使用令牌选择角色—使用经过身份验证的默认角色“。

(2)为了验证不同用户将会有不同权限的实验目的,请保证在Cognito User Pools中至少注册了两个用户。

(3)创建IAM Role Cognito_UserGroup1,附加名称为WildRydesAPI-StandardUserPolicy的IAM policy;创建IAM Role Cognito_UserGroup2,不附加任何IAM policy。

(4)分别创建User Pools用户组Cognito_UserGroup1和Cognito_UserGroup2,并关联(3)创建的对应IAM Role,分别向两个组内添加Cognito User。

(5)分别打开两个浏览器,使用Cognito_UserGroup1中的用户“heyang“和Cognito_UserGroup2中的用户“heyang2“用户登录系统,进入http://localhost:3000/app 页面进行验证,用户“heyang“可以正常请求 /ride API接口,用户“heyang2“请求失败,实验完成。

四、总结

通过使用Cognito + IAM Role与 AWS API Gateway 的集成我们可以轻松实现对系统用户API级的权限管理,这可以大大降低基于微服务架构的现代化应用在权限管理方面的复杂度,帮助研发团队更加聚焦于业务本身。

参考链接:

https://auth.serverlessworkshops.io/

https://aws.amazon.com/cn/blogs/china/cognito-group-api-gateway-lambda/?nc1=b_rp

本篇作者

曹赫洋

AWS 专业服务团队DevOps顾问。主要负责DevSecOps咨询和技术实施。在DevSecOps加速企业数字化转型方面领域拥有多年经验,对公有云、DevSecOps、基于云原生的微服务架构、敏捷加速研发效能等有深入的研究和热情。