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


猜你喜欢

  • Deno 中开发微信公众号的实践总结

    前言 Deno 是一个基于 V8 引擎的新一代运行时环境,它提供了一个安全的 TypeScript/JavaScript 运行时环境,并且已经可以用于实际项目中。微信公众号作为一种很受欢迎的在线营销推...

    5 个月前
  • Promise 与 async/await 提高开发效率

    在现代前端开发中,JavaScript 的异步编程是必不可少的技术之一。Promise 和 async/await 是两种最为常用的处理异步操作的方案,它们可以提高开发效率,使你的代码更具可读性和可维...

    5 个月前
  • RxJS 中的 switchMap 和 exhaustMap 的使用区别

    RxJS 是一个非常强大的响应式编程工具包,可以帮助开发者更简单、高效地编写复杂的异步代码。其中,switchMap 和 exhaustMap 是两个非常常用的操作符,它们都可以将一个 Observa...

    5 个月前
  • LESS 中灵活地使用变量提高编程效率

    在前端开发中,CSS样式的编写是一个不可避免的环节。而LESS是一种CSS预处理器,它可以极大地提高CSS的编写效率以及可重复性。其中最重要的特性之一就是变量,可以让我们在编写CSS样式时避免写重复的...

    5 个月前
  • 使用 PM2 启动 Cluster 模式

    引言 在前端开发中,我们常常需要针对高并发的访问量对后端服务进行优化,提升用户体验。Cluster,即集群模式,是一种常见的解决方案,可以将多个进程同时运行,共同承担服务的压力。

    5 个月前
  • Kubernetes 中使用 Pod Security Policy 进行安全策略的管理

    Kubernetes 是一个广受欢迎的容器编排平台,它的普及极大地推动了容器化技术的发展。虽然 Kubernetes 非常强大,但它也面临着诸多安全挑战。其中之一是确保容器安全运行。

    5 个月前
  • TypeScript 中的索引类型 (Index Type) 详解

    TypeScript中的索引类型是一种非常强大和灵活的类型,它可以让我们以一种更安全的方式来访问对象的属性和方法,并且还可以通过动态和泛型来进行更加通用和复杂的处理。

    5 个月前
  • MongoDB 中如何使用 MapReduce 处理大数据

    MongoDB 中如何使用 MapReduce 处理大数据 当我们需要处理大规模数据集时,常常需要使用 MapReduce 技术。MongoDB 作为一款流行的 NoSQL 数据库,也支持 MapRe...

    5 个月前
  • 如何在 Chai 中测试 API 文档?

    前端开发中,测试是至关重要的一环,而 Chai 是一个流行的测试框架,可以方便地对 API 文档进行测试。本文将指导您如何使用 Chai 测试 API 文档,并提供相应的示例代码。

    5 个月前
  • 深入理解 GraphQL 查询

    GraphQL 是一种新型的查询语言,主要用于 API 的请求和响应。相比 RESTful API,GraphQL 具有更高的可扩展性、灵活性和效率性。在前端开发中,了解 GraphQL 查询具有重要...

    5 个月前
  • 如何使用 Flask 以及 SSE 技术实现实时 web 推送?

    随着 web 应用的日益广泛,实时推送已经成为了很多应用必不可少的功能。而 SSE(Server-Sent Events)作为一种常见的实时推送技术,已经被越来越多地应用于前端开发。

    5 个月前
  • Next.js 项目中如何使用 Less 样式?

    如果您正在使用 React 框架 Next.js 搭建 Web 应用程序,那么您可能已经知道了,Next.js 已经支持了 Sass、CSS 模块及样式和 CSS-in-JS。

    5 个月前
  • SPA 中解决异步数据加载延迟问题

    前端开发中,单页面应用(SPA)已成为日常开发中较为常见的开发方式。而在SPA中,异步数据加载延迟问题却是不可避免的。 本文将结合实际项目经验,详细探讨如何在SPA中解决异步数据加载延迟问题。

    5 个月前
  • Hapi 应用中的 JWT 权限管理

    Hapi 应用中的 JWT 权限管理 随着前端应用的复杂度越来越高,对于权限管理的要求也越来越严格。而 JSON Web Token (JWT) 作为一种通用的声明式身份验证和授权标准,已经成为前后端...

    5 个月前
  • TypeScript 中的条件类型 (Conditional Types) 详解

    前言 TypeScript 是一门静态类型检查的编程语言,它扩展了 JavaScript 的特性,让 JavaScript 代码更加容易被理解和维护。TypeScript 中的条件类型 (Condit...

    5 个月前
  • Docker 中使用 nginx 作为负载均衡的方法

    随着互联网技术的不断发展,越来越多的公司开始使用容器化技术来管理应用程序。Docker 是当前最受欢迎的容器化解决方案之一,它可以快速构建、打包、部署和运行应用程序。

    5 个月前
  • ECMAScript 2021 优化 nullish coalescing 运算符

    ECMAScript 2021 优化 nullish coalescing 运算符 ECMAScript 2021 新增了一些特性,其中之一是更新了 nullish coalescing 运算符(??...

    5 个月前
  • 解决 Babel 编译 ES6 代码时提示错误:Cannot find module 'babel-core'

    在前端开发中,使用 ES6 语法可以让代码更加简洁、可读性更强。然而,ES6 语法并未被所有浏览器完全支持,因此需要使用 Babel 来将 ES6 代码编译成 ES5 代码。

    5 个月前
  • ECMAScript 2019 中的 Symbol 对象详解及其应用场景

    在 ECMAScript 2015 中,我们已经了解了新的数据类型 Symbol 。在 ECMAScript 2019 中, Symbol 对象迎来了一些新的变化和加强,本文将对其进行详细介绍,同时给...

    5 个月前
  • Mocha 测试中的测试代码优化

    在前端开发中,Mocha 是一款功能强大的测试框架,它可以帮助我们快速测试代码的正确性和稳定性。然而,测试代码也需要优化。本文将从测试代码的编写规范、测试代码的重构、测试代码的性能优化等方面来介绍 M...

    5 个月前

相关推荐

    暂无文章