设备认证和授权在网络应用安全方面至关重要。由于设备连接的增加,只有受信任的设备才能访问和与应用程序的资源进行交互,这一点至关重要。本文将解决一个现实问题,并为开发人员提供实用的见解,以增强其应用程序的安全性。
设备认证和授权在确保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
我们应该看到以下内容:
安装 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
我们应该在控制台中看到以下内容:
创建用户实体
对于这个简单的项目,我们需要一个用户实体。用户实体将具有列 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 。现在将以下内容添加到这些新