搜索
首页web前端js教程在 NestJS 服务器应用程序中使用 Clerk 进行身份验证

介绍

本文提供了使用 Clerk 在 NestJS 后端应用程序中实现身份验证和授权的全面分步指南。

什么是文员?

Clerk 是一个综合平台,提供可嵌入的用户界面、灵活的 API 以及用于无缝用户身份验证和管理的直观且强大的仪表板。它涵盖了从会话管理和多因素身份验证到社交登录、魔术链接、电子邮件或短信一次性密码等的一切。

为什么要使用文员?

身份验证和安全要求、趋势和最佳实践总是在不断发展,因为数据保护和隐私变得越来越重要。通过将这些责任转移给专业服务提供商,您可以专注于构建应用程序的核心功能并更快地交付。

像 Clerk 这样的平台可以为您承担这些安全任务。

先决条件

  • Typescript 基础知识
  • 熟悉 NestJS 基础知识
  • 了解后端身份验证概念
  • 运行 Node 18 或最新版本

项目设置

该项目需要一个新的或现有的 NestJS 项目、一个 Clerk 帐户和应用程序,以及 Passport、Passport Strategy 和 Clerk 后端 SDK 等库。

创建 NestJS 项目

您可以使用 Nest CLI 轻松设置新的 NestJS 项目。使用您喜欢的任何包管理器,运行以下命令来创建新的 Nest 应用程序:

$ pnpm add -g @nestjs/cli
$ nest new clerk-auth

查看 NestJS 文档以了解更多详细信息。

设置您的文员帐户和应用程序

如果您还没有 Clerk 帐户,请创建一个 Clerk 帐户并在 Clerk 仪表板中设置一个新应用程序。您可以在 Clerk 网站上开始使用。

安装所需的库

可以使用以下命令安装该项目所需的库:

$ pnpm add @clerk/backend @nestjs/config @nestjs/passport passport passport-custom

环境配置

在项目的根目录中创建一个 .env 文件来管理不同环境、生产、开发或登台的变量。

添加以下变量,用从 Clerk 帐户仪表板获取的实际密钥替换占位符。

# .env

CLERK_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY
CLERK_SECRET_KEY=YOUR_SECRET_KEY

要使用 ConfigService 访问整个应用程序中的环境变量,请将 ConfigModule 导入根 AppModule。

// src/app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
  ],
})
export class AppModule {}

在 NestJS 中集成 Clerk

本节介绍如何在您的 NestJS 项目中集成和使用 Clerk 后端 SDK。

创建 Clerk 客户端提供商

将 Clerk 客户端注册为提供程序,使其可以使用装饰器注入到类中,从而可以在整个代码库中的任何需要的地方使用它,如接下来的部分所示。

$ pnpm add -g @nestjs/cli
$ nest new clerk-auth

在 AppModule 中注册 ClerkClientProvider

接下来,您需要向 Nest 注册提供程序以启用依赖项注入。

$ pnpm add @clerk/backend @nestjs/config @nestjs/passport passport passport-custom

使用带有职员签发的 JWT 的护照

当用户通过 Clerk 的托管页面或前端应用程序注册或登录时,Clerk 会发出 JWT 令牌。然后,此令牌作为不记名令牌发送到向 NestJS 后端应用程序发出的请求的授权标头中。

制定文员策略

在NestJS中,Passport是推荐的实现身份验证策略的方式。您将创建一个自定义 Clerk 策略,用于使用 Clerk 客户端验证令牌。

# .env

CLERK_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY
CLERK_SECRET_KEY=YOUR_SECRET_KEY

validate() 方法返回 NestJS 自动附加到 request.user 的用户数据。

创建身份验证模块

创建一个 AuthModule,它提供 Clerk 策略并与 PassportModule 集成。然后,在AppModule中注册AuthModule。

// src/app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
  ],
})
export class AppModule {}
// src/providers/clerk-client.provider.ts

import { createClerkClient } from '@clerk/backend';
import { ConfigService } from '@nestjs/config';

export const ClerkClientProvider = {
  provide: 'ClerkClient',
  useFactory: (configService: ConfigService) => {
    return createClerkClient({
      publishableKey: configService.get('CLERK_PUBLISHABLE_KEY'),
      secretKey: configService.get('CLERK_SECRET_KEY'),
    });
  },
  inject: [ConfigService],
};

实施路由保护

受保护的路由是需要用户经过身份验证才能访问的路由。

创建文员身份验证守卫

守卫根据某些运行时条件确定特定请求是否应由路由处理程序处理。

如果您想默认保护应用程序中的所有路由,则需要执行以下步骤:

  1. 创建一个公共装饰器来标记无需身份验证即可访问的路由。
  2. 实现 ClerkAuthGuard 来限制对受保护路由的访问,仅允许经过身份验证的用户继续。
// src/app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ClerkClientProvider } from 'src/providers/clerk-client.provider';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
  ],
  providers: [ClerkClientProvider],
})
export class AppModule {}
// src/auth/clerk.strategy.ts

import { User, verifyToken } from '@clerk/backend';
import { Injectable, Injectable, UnauthorizedException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-custom';
import { UsersService } from 'src/users/users.service';
import { Request } from 'express';
import { ClerkClient } from '@clerk/backend';

@Injectable()
export class ClerkStrategy extends PassportStrategy(Strategy, 'clerk') {
  constructor(
    @Inject('ClerkClient')
    private readonly clerkClient: ClerkClient,
    private readonly configService: ConfigService,
  ) {
    super();
  }

  async validate(req: Request): Promise<user> {
    const token = req.headers.authorization?.split(' ').pop();

    if (!token) {
      throw new UnauthorizedException('No token provided');
    }

    try {
      const tokenPayload = await verifyToken(token, {
        secretKey: this.configService.get('CLERK_SECRET_KEY'),
      });

      const user = await this.clerkClient.users.getUser(tokenPayload.sub);

      return user;
    } catch (error) {
      console.error(error);
      throw new UnauthorizedException('Invalid token');
    }
  }
}

</user>

全局启用身份验证

由于默认情况下您的大多数端点都会受到保护,因此您可以将身份验证防护配置为全局防护。

// src/auth/auth.module.ts

import { Module } from '@nestjs/common';
import { ClerkStrategy } from './clerk.strategy';
import { PassportModule } from '@nestjs/passport';
import { ClerkClientProvider } from 'src/providers/clerk-client.provider';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [PassportModule, ConfigModule],
  providers: [ClerkStrategy, ClerkClientProvider],
  exports: [PassportModule],
})
export class AuthModule {}

定义受保护的公共路线

在这两个控制器中,AppController 中使用 Public 装饰器来将路由指定为公共。相比之下,AuthController 中不需要装饰器来将路由指定为受保护,因为身份验证防护默认情况下全局应用。

// src/app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ClerkClientProvider } from 'src/providers/clerk-client.provider';
import { AuthModule } from 'src/auth/auth.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    AuthModule,
  ],
  providers: [ClerkClientProvider],
})
export class AppModule {}
// src/decorators/public.decorator.ts

import { SetMetadata } from '@nestjs/common';

export const IS_PUBLIC_KEY = 'isPublic';
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);

注意:记得在AppModule中注册AppController,在AuthModule中注册AuthController。

结论

Clerk 作为一个平台,负责处理身份验证和安全责任,紧跟最新趋势和最佳实践。这使您能够专注于构建应用程序的核心功能并加速您的开发过程。

在本指南中,我们介绍了实施 Clerk 身份验证的步骤,从设置项目到保护路由。这些基本步骤应该可以帮助您开始探索身份验证服务平台的可能性。

本文末尾包含该项目的完整功能示例。

Authentication with Clerk in NestJS Server Application 达米王 / 职员巢授权

在 NestJS 后端应用程序中使用 Clerk 身份验证和用户管理

Clerk-NestJS 身份验证

在 NestJS 后端应用程序中使用 Clerk 身份验证和用户管理

里面有什么?

这个 monorepo 包含以下软件包和应用程序:

应用程序和软件包

  • api:一个 NestJS 应用

每个包和应用程序都是 100% TypeScript。

实用工具

这个 monorepo 已经为您设置了一些附加工具:

  • 用于静态类型检查的 TypeScript
  • 用于代码检查的 ESLint
  • 代码格式更漂亮



在 GitHub 上查看


以上是在 NestJS 服务器应用程序中使用 Clerk 进行身份验证的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在JavaScript中替换字符串字符在JavaScript中替换字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

8令人惊叹的jQuery页面布局插件8令人惊叹的jQuery页面布局插件Mar 06, 2025 am 12:48 AM

利用轻松的网页布局:8个基本插件 jQuery大大简化了网页布局。 本文重点介绍了简化该过程的八个功能强大的JQuery插件,对于手动网站创建特别有用

构建您自己的Ajax Web应用程序构建您自己的Ajax Web应用程序Mar 09, 2025 am 12:11 AM

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10个JQuery Fun and Games插件10个JQuery Fun and Games插件Mar 08, 2025 am 12:42 AM

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

如何创建和发布自己的JavaScript库?如何创建和发布自己的JavaScript库?Mar 18, 2025 pm 03:12 PM

文章讨论了创建,发布和维护JavaScript库,专注于计划,开发,测试,文档和促销策略。

使用AJAX动态加载盒内容使用AJAX动态加载盒内容Mar 06, 2025 am 01:07 AM

本教程演示了创建通过Ajax加载的动态页面框,从而可以即时刷新,而无需全页重新加载。 它利用jQuery和JavaScript。将其视为自定义的Facebook式内容框加载程序。 关键概念: Ajax和JQuery

jQuery视差教程 - 动画标题背景jQuery视差教程 - 动画标题背景Mar 08, 2025 am 12:39 AM

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

如何为JavaScript编写无曲奇会话库如何为JavaScript编写无曲奇会话库Mar 06, 2025 am 01:18 AM

此JavaScript库利用窗口。名称属性可以管理会话数据,而无需依赖cookie。 它为浏览器中存储和检索会话变量提供了强大的解决方案。 库提供了三种核心方法:会话

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境