如何使用 NestJs、PostgreSQL、Redis 构建基于用户设备的授权验证

本文介绍了如何使用NestJs、Redis和PostgreSQL实现基于设备的认证和授权,强调了设备认证在网络安全中的重要性。通过创建Docker-compose文件、设置环境变量、安装依赖、构建服务器、实现用户实体、Redis缓存和认证模块,演示了如何确保只有受信任的设备能访问应用程序。文章还提供了详细的步骤和代码示例,包括使用不同客户端设备进行测试和退出登录的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0c1ba74c0557edeec76353281bfd6981.jpeg

设备认证和授权在网络应用安全方面至关重要。由于设备连接的增加,只有受信任的设备才能访问和与应用程序的资源进行交互,这一点至关重要。本文将解决一个现实问题,并为开发人员提供实用的见解,以增强其应用程序的安全性。

设备认证和授权在确保Web应用程序安全方面起着至关重要的作用。它们是维护敏感数据、用户账户和应用程序整体完整性的综合安全策略的重要组成部分。

设备认证是验证设备身份和合法性的过程,该设备试图访问系统或应用程序。当设备身份得到验证后,设备授权便着重于确定它在应用程序中可以执行哪些操作。

以下是设备认证和授权重要性的一些原因:

  • 它防止未经授权的访问信息和非法用户。

  • 它减轻了账户劫持攻击。

  • 它增强了双因素认证(two-factor authentication)。

  • 它为在线银行或金融交易等活动增加了额外的安全层。

  • 它可以帮助防止跨站请求伪造(CSRF)攻击。

  • 它保护用户的隐私,从而减少其个人信息的潜在曝光。

我们将使用NestJs和Redis来进行演示。NestJs是一个用于构建服务器端应用程序的NodeJs框架。我们将在该项目的服务器端使用它。Redis是一个开源的内存数据存储,用作数据库、缓存、流引擎和消息代理。在本文中,我们将利用缓存功能。借助NestJs作为我们的后端服务器,Redis用于缓存,以及PostgreSQL用于数据库,让我们进行设备认证和授权。

创建我们的 Docker-compose 文件

创建项目文件夹 device-authentication ,或者你可以随意命名。在其中创建一个文件 docker-compose.yaml 。使用Docker,我们不需要在本地机器上安装PostgreSQL数据库或Redis。

# device-authentication/docker-compose.yaml
version: "3.7"
services:
 postgres:
   image: postgres:13-alpine
   restart: always
   env_file:
     - .env
   environment:
     - POSTGRES_USER=$POSTGRES_USER
     - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
   ports:
     - "$POSTGRES_PORT:$POSTGRES_PORT_DOCKER"

   volumes:
     - postgres_data:/var/lib/postgresql/data
   networks:
     - db_network

 redis:
   image: redis
   container_name: our_redis
   command: redis-server --save 60 1 --loglevel warning
   env_file:
     - .env
   environment:
     - ALLOW_EMPTY_PASSWORD=yes
     - REDIS_REPLICATION_MODE=master
   ports:
     - "6379:6379"
   hostname: redis
   restart: always
   depends_on:
     - postgres

volumes:
 postgres_data:

networks:
 db_network:

总的来说,上面的 docker-compose.yml 文件定义了两个服务:PostgreSQL和Redis。我们将Redis服务命名为 our_redis 。我们还设置了它们的配置、依赖关系、环境变量、端口、卷和网络。

创建.env文件

在我们开始容器之前,我们需要创建一个 .env 来存储我们的环境变量。现在,创建该文件并添加以下内容:

POSTGRES_USER=postgres

POSTGRES_URL=postgresql://postgres:12345@localhost:5432/device-postgres?schema=public

POSTGRES_PASSWORD=12345

POSTGRES_PORT_DOCKER=5432

POSTGRES_PORT=5432

在上述的 .env 文件中,我们指定了我们的PostgreSQL数据库的用户。我们还设置了我们数据库的URL、数据库的端口以及PostgreSQL密码。

启动我们的容器

运行下面的命令来启动我们的容器。

docker compose up

我们应该看到以下内容:

0bc1c866cd17e042dfdbbf45eb94317c.png

安装 NestJs

为了与我们的容器进行通信,我们需要一个后端服务器。

通过运行以下命令在全局安装 Nestjs CLI:

npm i -g @nestjs/cli

进入 device-authentication 文件夹,并通过运行以下命令创建一个 NestJs 应用程序:

nest new .

安装其他依赖

安装以下依赖项:

npm i typeorm @nestjs/typeorm dotenv @nestjs/cache-manager cache-manager cache-manager-redis-store@2 @types/cache-manager-redis-store @nestjs/jwt device-detector-js

在上面的依赖项中,我们有以下内容:

  • @nestjs/cache-manager :这有助于将缓存功能集成到应用程序中。

  • cache-manager :这使得函数在缓存中的封装变得容易。

  • cache-manager-redis-store@2 :这是Redis版本2的缓存存储实现。

  • @nestjs/jwt :这是一个基于 jsonwebtoken 包的Nest的JWT实用程序模块。

  • device-detector-js :这将解析或检测任何用户代理和浏览器、操作系统、设备等。

  • dotenv :该模块帮助将环境变量从 .env 文件加载到 process.env 中。

  • typeorm @nestjs/typeorm :由于我们使用PostgreSQL,我们需要它作为我们的对象关系模型。

运行我们的服务器

运行下面的命令来启动我们的服务器。

npm run start:dev

我们应该在控制台中看到以下内容:

e6abc2ed293c4f98ccd9685f748c5e2f.jpeg

创建用户实体

对于这个简单的项目,我们需要一个用户实体。用户实体将具有列 id , name , email 和 password 。在 src 文件夹内,创建一个名为 entities 的文件夹,并在其中创建一个文件 user.ts 。然后,在这个新文件中添加以下代码。

// src/entities/user.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class User {
 @PrimaryGeneratedColumn("uuid")
 id?: string;

 @Column({ type: "varchar", nullable: false })
 name: string;

 @Column({ type: "varchar", nullable: false, unique: true })
 email: string;

 @Column({ type: "varchar", nullable: false })
 password: string;
}

export default User;

上面代码中的 id 列是主字段。

创建 Redis Provider

在这一点上,我们需要创建一个关于Redis的代码程序来处理用户设备上的缓存。它将允许我们在Redis缓存中获取、设置、删除和重置键。

在 src 文件夹内创建一个名为 providers 的文件夹。在这个“providers”文件夹内创建一个名为 redis-cache 的文件夹。在这个新文件夹内,创建文件 redis-cache.module.ts 和 redis-cache.service.ts 。现在将以下内容添加到这些新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值