几分钟内为 Logto 构建一个基于 Node.js 的框架 SDK
学习如何使用 `@logto/node` 为 Logto 创建一个自定义 SDK。
之前在这篇文章中,我们花了几分钟为 Logto 构建了一个 Web SDK。现在,让我们专注于 Node.js,这是 JavaScript 开发者的另一种流行平台。
在本指南中,我们将逐步指导你如何使用 @logto/node
创建一个简单的 Express SDK 以集成 Logto。该 SDK 将实现登录流程,你可以按照相同的步骤为其他任何基于 Node.js 的平台(如 Koa、Next.js、NestJS 等)创建 SDK。
登录流程
在开始之前,让我们回顾一下 Logto 中的登录流程。登录流程包括以下步骤:
- 重定向到 Logto:用户被重定向到 Logto 登录页面。
- 身份验证:用户输入他们的凭证并在 Logto 上进行身份验证。
- 重定向回你的应用程序:身份验证成功后,用户将通过授权码重定向回你的应用程序。
- 授权码交换:你的应用程序将授权码交换为令牌,并将令牌存储为身份验证状态。
@logto/node
简介
与 @logto/browser
类似,@logto/node
包提供了一个 LogtoClient
类,该类提供了 Logto 的核心功能,包括登录流程的方法:
signIn()
:生成 OIDC 授权 URL 并重定向到该 URL。handleSignInCallback()
:检查并解析回调 URL,提取授权码,然后通过调用令牌端点将其交换为令牌。getContext()
:根据会话 cookie 获取当前请 求的上下文,包括身份验证状态和用户信息。
构建 Express SDK
在 SDK 中,我们将提供两个路由处理程序 (/sign-in
和 /sign-in-callback
) 以及一个 withLogto
中间件:
/sign-in
:触发登录流程的路由处理程序,响应中重定向到 OIDC 授权 URL。/sign-in-callback
:处理回调 URL 的路由处理程序,交换授权码为令牌并存储它们,完成登录流程。withLogto
中间件:调用getContext()
以检索当前请求的上下文,包括身份验证状态和用户信息。
要使用 SDK,你只需将中间件添加到你的 Express 应用程序中以保护路由,并使用路由处理程序来触发登录流程和处理回调。
第一步:安装包
首先,使用 npm 或其他包管理器安装 @logto/node
包:
第二步:准备存储适配器
需要存储适配器来初始化 LogtoClient
实例。
假设 SDK 用户已经设置了 Express 会话,我们可以通过创建一个新文件 storage.ts
来简单实现 Storage
类:
第三步:实现路由处理程序
HTTP 请求是无状态的,所以我们需要为每个请求初始化客户端实例。让我们准备一个帮助函数来创建客户端实例:
在这个函数中,我们实现了 navigate
适配器以及 ExpressStorage
适配器。navigate
适配器用于将用户重定向到登录 URL。
接下来,让我们实现路由处理程序,封装在一个函数 handleAuthRoutes
中:
/auth/sign-in
路由处理程序通过调用signIn()
启动登录流程,登录状态将存储在会话中,并由/auth/sign-in-callback
路由处理程序使用。/auth/sign-in-callback
路由处理程序处理回调 URL,并通过调用handleSignInCallback()
将授权码交换为令牌,这些令牌将由ExpressStorage
适配器存储在会话中。交换完成后,用户将被重定向回主页。
第四步:实现中间件
withLogto
中间件用于保护路由。它调用 getContext()
以获取当前请求的上下文,包括身份验证状态和用户信息。
getContext
函数使用存储适配器从会话中获取令牌。
检查点:使用 SDK
现在你已经为 Logto 构建了 Express SDK,可以通过添加中间件来保护路由,并使用路由处理程序来触发登录流程和处理回调,将其应用到你的应用程序中。
这是一个如何在你的 Express 应用程序中使用 SDK 的简单示例:
在这个示例中,我们使用 withLogto
中间件来检查身份验证状态,如果用户没有进行身份验证,则将其重定向到登录页面,否则我们将显示欢迎信息。
你可以在这里查看官方的 Express 示例项目。
结论
在本指南中,我们逐步指导你如何创建一个 Express SDK 来实现基本的身份验证流程。这里提供的 SDK 是一个基础示例。你可以通过添加更多方法和功能来扩展它,以满足你应用程序的需求。
你可以按照相同的步骤为任何在 Node.js 中运行的其他 JavaScript 平台创建 SDK。
资源: