身份认证与 Cognito 服务介绍

在 Web 或 App 开发过程中,用户的认证和权限处理是非常重要的一个模块,这里包括用户注册、登录认证及管理对应的权限。除了用户名密码登录外,通过第三方社交帐号登录也是非常重要的需求,在国外主要是 Google、Facebook 或 Apple 登录等,而在国内则主要是微信、微博登录等。

身份认证与授权实现起来相应复杂,因此在 AWS 云上提供了 Cognito 服务,以帮助开发者更快、更安全地接入用户注册/登录和访问控制功能。Cognito 服务让企业可以把更多的精力花在核心业务上,去关注创新、创收,而非过多关注身份认证与授权相关的底层技术细节。

Cognito 服务构成:

  • Cognito User Pool

即用户池,为应用程序提供注册和登录选项的用户目录。利用用户池,用户可以通过 Cognito 登录 Web 或 App。用户还可以通过社交身份提供商(例如 Google、Facebook、Amazon 或 Apple)以及 SAML 身份提供商登录。

  • Cognito Identity Pool

即身份池,或联合身份,可以为用户创建唯一身份,并将它们与身份提供商联合。有了身份池,用户便可以获取权限受限的临时 AWS 凭证以访问其他 AWS 服务。身份池可以包括 Cognito User Pool 中的用户,外部身份提供商(如 Google/Facebook)或基于 OpenID Connect/SAML 的身份提供商进行身份验证的用户。

Cognito 应用场景:

目前 Cognito 被广泛应用在客户创建的 Web 或 App 中,也应用在许多 AWS Solutions 中。目前主要是两个使用场景:

  • API Gateway 可以集成 Cognito User Pool 进行用户身份认证与授权,方便对 API 进行保护。
  • 结合 Cognito Identity Pool 来在 Web 或移动端安全地获取 AWS 临时凭证,进而访问其他 AWS 服务。

Cognito User Pool 在国内区域的替代方案

目前 AWS 国内区域上线了 Cognito Identity Pool,但 Cognito User Pool 暂未上线。因此我们在这个博客里会探索如何在现阶段找到 Cognito User Pool 的替代方案。我们的基本思路是找到一个基于 OpenID Connect 协议的认证服务,可以是第三方 SaaS(如 Authing,Auth0 等),或是自建(如基于开源的 Keycloark 软件等)。由于 Authing 是 AWS 在国内的合作伙伴,我们在这里会并以一个常见的网站为例,探讨如何使用 Authing 来做为 Cognito User Pool 的替代方案,描述相关的技术原理,并介绍如何进行部署。

1. 架构设计

演示网站整体架构如下:

  • 通过 S3 进行静态网站托管, 并利用 Cloudfront 进行静态内容加速和 HTTPS 证书挂载。
  • 通过 Authing 进行登录认证并获取令牌,作为 User Pool 的替代方案。
  • 访问 API Gateway 提供的 REST API。
  • 通过 Cognito Identity Pool 获取临时 AWS 凭证,访问 AWS 资源(这里以 Polly 服务为例)。

结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

演示网站目前已部署在 AWS 国内区域, 链接如下:

https://authing.demo.cbuilder.tech/

进行简单的用户注册后可以查看访问效果。

通过 Authing 进行登录认证并获取令牌

结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

Authing 基于 OIDC 和 OAuth 2.0 对用户进行身份验证,并授予用用户访问对应的应用的权限,使用场景如上图所示。

  1. 在第一步中,用户通过 Authing 用户池请求登录,并在成功进行身份验证后,从服务器获取到 code。
  2. 接下来,应用程序通过身份池带着 code 请求 token。
  3. 最后,用户可以使用 token 来请求访问各种应用资源。

上图介绍了OIDC Authorization Code Flow来获取Token, 用户也可以通过OIDC Implicit Flow 来获取Token。本示例使用的是Implicit Flow, 关于这两种流程的对比可以参考这个链接

访问 API Gateway 提供的受保护的 REST API

通过 Authing 登录认证后,可获取令牌(即 id token)。通过发送 HTTP 请求时在 header 携带令牌,即可访问受保护的 REST API。

结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

通过与 Identity Pool 集成安全访问 AWS 服务

通过 Authing 登录认证后,可获取令牌(即 id token)。通过与 Identity Pool 集成来获取临时凭证,进而安全地访问 AWS 资源

结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

2. 方案部署

演示网站的前端和后端代码均已发布在 Github:

https://github.com/linjungz/aws-authing-demo

可参照相关代码进行部署和测试

2.1 Authing 帐号开通与 OIDC 应用配置

首先需要先在 Authing 中创建 OIDC 应用,具体可以参考Authing 相关的帮助文档。这个演示环境使用的是 Implicit Flow,并使用 RS256 算法进行 id token 签名,可参考如下进行回调 URL、授权模式、返回类型等设置:

结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

2.2 通过 SAM 部署 API Gateway 与 Lambda

由于 id token 使用 RS256 算法进行加密,因此需要在 Lambda Authorizer 中设置相应密钥,以便进行 token 验证。具体可以参考示例代码app.js中的相关注释

演示环境中 API Gateway 及相关 Lambda 已经描述在一个 AWS SAM 模板(template.yaml)中,通过 SAM 可以直接进行自动部署:

$ sam build
$ sam deploy --guided

2.3 Authing 与 Identity Pool 集成的配置

  • 配置 OIDC Provider

创建成功后如下所示: 结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

具体配置可参考AWS 相关官方文档

  • 配置 Cognito Identity Pool

指定 Authing 做为 Authenticated Provider : 结合 Authing 实现 AWS 云上的身份认证与授权-LMLPHP

同时,Cognito Identity Pool 会分别创建两个 IAM Role(针对认证用户和匿名用户),需要对认证用户的 IAM Role 进行权限设定,示例网站使用了 Polly 服务,因此需要添加访问 Polly 的权限。

2.4 部署静态网站做为前端演示

前端演示页面 可以上传到 S3 桶,并开启 S3 静态网站托管功能,注意需要在前面增加 Cloudfront 并添加 HTTPS 证书; 或者可以选择部署在一台 EC2 上。

小结

从上述示例代码可以看到,通过将 Authing 与 AWS 相关服务进行集成,可以快速建立一个托管的用户池,并对 AWS 的相关资源(如 API 网关,S3, IoT, AI 等服务)实现安全的调用,实现类似于 Cognito User Pool 服务的功能。目前利用 Authing 我们已经将 AWS IoT Device Simulator 这个解决方案从 AWS 国外区域迁移到了 AWS 国内区域,实现了对 Cognito User Pool 服务的替代,目前该服务已经在AWS国内官网正式发布,感兴趣的朋友也可以查看该解决方案的源码,了解我们如何利用 Authing 来做为 User Pool 并与 AWS API Gateway 和 AWS Cognito Identity Pool 服务进行集成。

考虑到企业客户对数据安全和合规的要求,Authing 除了可以作为 SaaS 方式与 AWS 服务进行集成外,也可以以单租户的方式私有部署在客户自己的 AWS 帐号内。更多关于 AWS 合作伙伴 Authing 的信息,欢迎前往其官网进行查询。

关于 AWS 合作伙伴 Authing

Authing 身份云是北京蒸汽记忆科技有限公司的产品,公司坐落于北京五道口,研发团队均来自于阿里、字节跳动、滴滴等头部公司。Authing 是国内第一家提供用户身份管理(CIAM)解决方案的云服务,为企业和开发者提供完善、易用和安全的用户认证和管理服务。上线之初,就被中国信息通信研究院评选为「国内身份管理与访问控制领域创新企业」,并被录入《2019 年网络安全产业白皮书》。Authing 已为中国石油、埃森哲、德高集团、东南大学等国内外优秀企业打造了卓越的开发方式和高效的 IT 管理,并已获得华创、YC China、Plug and Play 等顶级投资机构数千万元投资。

05-07 21:47