Serverless 架构中采用 Cognito 进行用户认证

什么是 Serverless 架构?

Serverless 架构是一种新兴的云计算架构,其核心理念是将服务提供商如 AWS、Azure 等云服务商中的计算资源从单个服务器模式转变为按需和动态化分配和管理的服务模式。典型的 Serverless 架构中,开发者不再需要为服务器管理和维护等工作而烦恼,由云服务商负责分配基础架构的资源,开发者可以专注于业务逻辑和代码的编写,充分发挥创造价值的能力。

为什么需要 Cognito 进行用户认证?

在 Serverless 架构中,由于所有的计算资源都来自于云服务商,因此如何保证用户的数据和隐私安全存储和使用就变得尤为重要。同时,对于包含用户登录等敏感信息的应用程序而言,一定的用户认证和授权机制是必不可少的。因此,Serverless 架构中采用 Cognito 进行或的认证就显得尤为有意义了。

Amazon Cognito 是一种管理和身份验证服务,它允许开发者轻松添加用户认证和授权功能到他们的应用程序中,而不必自行构建和维护自己的身份验证解决方案。通过 Cognito,开发者可以基于多种身份提供者,包括社交网络、企业身份提供者,还可以采用自己的用户池来实现身份验证。在使用 Cognito 进行用户认证时,我们可以通过构建身份池,创建支持身份验证的应用程序等方法,具有简便、可定制化性强等优势。

如何在 Serverless 中集成 Cognito 进行用户认证?

我们以 Lambda、API Gateway、Cognito、DynamoDB 作为核心服务来演示如何使用 AWS 服务构建一个简单的 Serverless web 应用程序。该应用程序显示储存在 DynamoDB 表中的代笔,并允许用户通过网页表单将新值添加到表格中,同时可以通过 Cognito 实现用户认证与授权的功能。

第一步:创建 AWS 资源

创建一个 DynamoDB 表格来存储笔记,其中表单包含以下属性:

  • id - 表的唯一键。
  • note - 笔记文本。
  • createdTime - 笔记创建时间戳。
  • userId - 笔记作者的用户 ID。

创建身份池并向应用程序添加用户认证和授权的功能:

  1. 在 Cognito 控制台中,创建一款新的身份池。
  2. 在身份池中运用身份提供者添加对社交提供者、企业身份提供者、Cognito User Pools 的支持。
  3. 在身份池中创建一个名为 notes-app 的新应用程序。
  4. notes-app 应用程序创建一个新的用户角色,具有以下权限:
    • aws:authlogin - 允许用户登录和注销。
    • dynamodb:PutItem - 允许用户在 DynamoDB 表格中创建新笔记条目。
    • dynamodb:DeleteItem - 允许用户删除 DynamoDB 表格中的笔记。
  5. 向应用程序添加身份验证 API,用户可以通过该 API 登录和注销应用程序。

第二步:编写 Lambda 函数

Lambda 函数是该应用程序的核心;它们处理从 API Gateway 发出的请求,并将数据存储到 DynamoDB 表格中。我们将需要以下两个 Lambda 函数:

  1. CreateNoteHandler - 创建新的笔记。
  2. DeleteNoteHandler - 删除现有笔记。

每个 Lambda 函数都需要从 API Gateway 获取事件数据,解析 JSON 正文,从 Cognito 中验证令牌并从中提取出用户信息以及检查用户是否有足够的权限执行请求操作等步骤。以下是概括 Lambda 函数的伪代码:

------ --------------------------- - ----- ------- -------- -- -
  -- -------- ------- --------- ---- --
  ----- ----------- - -----------------------

  -- -------- ------- ------ --- ----- ------- ---------
  ----- ----- - -------------------------------------------
  ----- --------------- - ----- ----------------------------

  -- ------------------
  -- ------------------------------------------------------------- -
    ----- ---- ---------- -- ------ -------
  -

  -- -- -------- --------
  ----- -------- - --- ------------------------------
  ----- --------------
    ---------- ------------------------
    ----- -
      --- -------
      ----- -----------------
      ------------ -----------
      ------- ------------------------------------
    --
  ---

  -- -- ---- --------
  ------ -
    ----------- ----
    ----- ---------------- -------- ----- --------- ---
  --
--

第三步:部署集成调试

我们可以在本地调试 Lambda 函数,在 AWS Lambda 中打开调试器、SET AWS_DEBUG=1 环境变量并确保 Lambda 函数的代码可以在本地运行,检查代码逻辑,确保与预期一致。在终端启动调试器,打开 VS Code 中使用 AWS Toolkit for VS Code 插件来部署集成应用程序,管理远程资源并跟踪问题。

使用如下代码创建和部署 Lambda 函数:

- ------ ------ -------- -- ----
- --- ------ --------------- -
---------------- --------------------------- -
---------- ---------- -
------- ------------------------------------------ -
---------- ------------------------------- -
------- ---------------------------------------------

- ------ --- ------- -- ----------
- --- ---------- --------------- ------ ---------

- ------ ---------- ----- ---- --- ------
- --- ------ ----------------- ---------------- ------------------

第四步:开放端点

我们需要在 API Gateway 配置中设置端点,并确保端点与 Lambda 函数之间的映射正确。这些端点将允许我们通过 REST 服务器来与 Lambda 函数进行交互。注意,我们必须通过 Cognito 进行使用服务端 API 鉴权。

总结

通过这个简单的示例,我们可以看到,当采用 Cognito 进行用户认证时,Serverless 架构可以很大幅度地降低用户认证的开发和维护成本。同时,我们还介绍了如何通过 AWS 服务构建一个 Serverless web 应用程序,并使用 Lambda 函数、API Gateway、Cognito、DynamoDB 等核心服务,向读者演示了如何使用这些服务来构建一个简单的 Serverless 应用程序,其中包括用户认证和授权的功能。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/664d66c8d3423812e4cefda7