SEO基础

SEO基础

Products

当前位置:首页 > SEO基础 >

如何用NestJS构建AuthService?

96SEO 2026-08-15 10:00 0


搭建完整的 Auth 服务

创建 AuthService

使用者痛点:登录时需要自行查询数据库、比对密码并手动剔除敏感字段,代码易遗漏导致安全隐患。说起来,


// src/auth/auth.service.ts
import { Injectable。Logger,UnauthorizedException } from '@nestjs/common';import { JwtService } from '@nestjs/jwt';import { InjectRepository } from '@nestjs/typeorm';import { Repository } from 'typeorm';import { User } from 'src/user/entities/user.entity';import { removeUserData } from 'src/utils';@Injectable
export class AuthService {
private readonly logger = new Logger;constructor(
@InjectRepository
private readonly userRepository: Repository,private readonly jwtService: JwtService。) {}
// 验证账号密码
async validateUser: Promise {
const user = await this.userRepository.findOne({
再看where,{ account,isDeleted: false },});if )) {
delete user.passwordHash;delete user.isDeleted;return user,}
return null;}
// 生成 JWT
async createToken {
return this.jwtService.signAsync;}
// 登录成功后返回 token
async login {
const payload = {
account: user.account。userId: user.id,roleId: user.roleId,roleType: user.roleType,roleWeight: user.roleWeight,};其实,const token = await this.createToken;return { token };}
// 查询当前登录使用者信息
async queryCurrentUser {
try {
if {
const user = await this.userRepository.findOneBy;老实说,return removeUserData;}
} catch {
this.logger.error;throw new UnauthorizedException;}
}
}

新建 AuthController

使用者痛点:前端经常找不到统一的登录/登出接口,导致业务层自己实现重复逻辑。

如何用NestJS构建AuthService?

import {
Controller。Post,Get,Body,BadRequestException,Req,Res,} from '@nestjs/common';import { ApiBody,ApiOperation,ApiResponse。ApiTags } from '@nestjs/swagger';import { AuthService } from './auth.service';import { LoginDto } from './dto/login.dto';@Controller
@ApiTags
export class AuthController {
constructor {}
@Post
@ApiOperation
@ApiBody
@ApiResponse
async login loginDto: LoginDto) {
const user = await this.authService.validateUser(
loginDto.account。loginDto.password,);if throw new BadRequestException;话说回来,try {
return await this.authService.login;} catch {
throw new BadRequestException;}
}
@Post
@ApiOperation
@ApiResponse
logout req,@Res res): void {
// 清除 cookie 中的 jwt
res.cookie });// 前端若存储在 localStorage,需要自行删除
res.status.send({
说到code。0,msg: 'success',result: { message: '登出成功' },});}

新建 LoginDto

使用者痛点:缺少统一的请求参数校验,导致后端频繁出现参数缺失或格式错误的异常。其实,


import { ApiProperty } from '@nestjs/swagger';import { IsNotEmpty,IsString,IsEmail。Matches } from 'class-validator';export class LoginDto {
@IsEmail
@IsString
@IsNotEmpty
@ApiProperty({
description: '账号'。example: '',})
account!: string,@Matches.{8,16}$/,{
message:
'请输入8-16位数字+字母的密码'。})
@IsString
@IsNotEmpty
@ApiProperty
password!: string,}

新建 AuthModule

使用者痛点:模块之间依赖混乱,常因忘记导入 TypeOrmModule 导致 Repository 为


import { Module } from '@nestjs/common';import { JwtModule } from '@nestjs/jwt';import { PassportModule } from '@nestjs/passport';import { TypeOrmModule } from '@nestjs/typeorm';import { AuthService } from './auth.service';话说回来,import { AuthController } from './auth.controller';import { JwtStrategy } from './jwt.strategy';import { JwtAuthGuard } from './jwt-auth.guard';import { User } from 'src/user/entities/user.entity';const jwtModule = JwtModule.register({
至于global,true。secret:'niunai',// 建议使用 env 配置更安全
signOptions:{ expiresIn:'24h' },});@Module({
imports:,controllers:,providers:,exports:。})
export class AuthModule {}

配置 JWT 策略

使用者痛点:token 验证逻辑散落各处,难以统一维护;忘记同步 secret 导致验证失败。


import { Injectable } from '@nestjs/common';import { PassportStrategy } from '@nestjs/passport';import { ExtractJwt,Strategy } from 'passport-jwt';@Injectable
export class JwtStrategy extends PassportStrategy {
constructor {
super({
jwtFromRequest : ExtractJwt.fromAuthHeaderAsBearerToken。ignoreExpiration : false,secretOrKey : 'niunai',// 与 JwtModule 注册时保持一致
});}
async validate{
return{
userId : payload.userId,account : payload.account。roleId : payload.roleId,roleType : payload.roleType,roleWeight : payload.roleWeight,};}
}

新建 JwtAuthGuard 路由守卫

使用者痛点:每个受保护接口都要手动写 Guard,且排除路由时容易写错方法或忘记更新。


import {
Injectable,ExecutionContext。Logger,UnauthorizedException,} from '@nestjs/common';import { AuthGuard } from '@nestjs/passport';import { JwtService } from '@nestjs/jwt';import { excludedRoutes } from './excluded.routes';@Injectable
export class JwtAuthGuard extends AuthGuard {
private readonly logger = new Logger;constructor{
super;}
async canActivate:Promise{
const request = context.switchToHttp.getRequest;const{ path,method}=request;// 路由排除
const isExcluded = excludedRoutes.some(
route=> route.path===path && route.method===method);if return true;const token = request.get;this.logger.log;if{
throw new UnauthorizedException;
说起来,}
const = token.split;if{
throw new UnauthorizedException;}
try{
const decoded = await this.jwtService.verifyAsync;if{
request.user = decoded;return this.activate;}
}catch{
throw new UnauthorizedException;}
}
async activate:Promise{
return super.canActivate as Promise;}
}

排除路由示例


export const excludedRoutes =;说起来,

全局注册 JWT Guard

使用者痛点:忘记在入口文件挂载 Guard。导致未受保护的接口被外部直接访问。话说回来,


// main.ts
async function bootstrap{
const app = await NestFactory.create;app.useGlobalGuards);await app.listen;}
bootstrap,按理说,

请求响应加密封装

User Pain Point: 前后端传输敏感数据时缺乏统一加解密方案。导致业务方自行实现且安全性参差不齐。

AES + RSA 混合加密流程概览

  • AES 密钥生成:服务端随机生成对称密钥,用于本次请求的数据加密。
  • AES 加密数据: 使用 AES‑C娱乐/CTR 对业务数据进行加密,得到 ciphertext。
  • RSA 公钥加密 AES 密钥: 前端通过后端提供的 RSA 公钥对 AES 密钥进行非对称加密,得到 encryptedKey。
  • 返回结果结构: `{ encryptedKey:string,data:string /* base64 ciphertext */}`。
  • 解密流程: 前端使用私钥解密得到 AES 密钥,再解密 data;后端同理使用私钥恢复 AES 密钥后解密请求体。

*注意*

  • AES 使用随机 IV,每次请求必须把 IV 一并返回给前端。
  • PRACTICE:生产环境请使用硬件 HSM 或云 KMS 管理 RSA 私钥,切勿硬编码在源码中。

安全性常用方法

  • 数据校验: Dto 中加入 @IsString@Length,@Matches等装饰器,并在全局开启 ValidationPipe,以防止 SQL 注入与 XSS。
  • XSS 防护: NestJS 本身不会自动转义输出,但配合前端模板引擎或使用 CSP Header 能有效减少风险。
  • 在需要状态保持的页面启用 csurf,或者改用 SameSite=Strict 的 Cookie。怎么说呢,
  • Password Hashing: 使用 bcrypt / argon2 对使用者密码进行单向哈希存储。并在实体类中提供 .validatePassword方法。
  • Rate Limiting: 对登录、验证码等高危接口加入 IP 限流,例如使用 .
  • ​ ​ ​ ​ ​ ​ ​

ts


公共模块开发 – Excel 导出示例

Create Excel Service


import * as XLSX fro m ’xlsx’;import {@ njectable} fro m ’@ nestjs /common’;

@ Injectable export cl ass ExcelSe rvice{ /* Export JSON array to an excel file */ exportAsExcelFile:Buffer{ cons t worksheet:XLSX.WorkSheet= XLSX.utils.jsontosheet;cons t workbook:XLSX.WorkBook={Sheets:{data:wor kshee t},SheetNames:};retu rn XLSX.write;} } < / pre>

html typescript import{ Controller。Res,HttpStatus,Body,Post,BadRequestException,}from ’@nestjs/common’;话说回来,import{ExcelSe rvice}from ’./excel.service’;话说回来,import{ExcelDt o}from ’./dto/excel.dto’;import{ApiBody,ApiTags}from ’@nestjs/swagger’;

@Cont roller @ApiTags export cl ass ExcelCo ntroller{ con structor{} @Post @Ap iBody exp ortExcellbod y:E xcelDt o,@Resres ){ tr y{ con st buffer=this.excelSer vice.exportAsExcelFile;‑‑ set header‑‑- res.setHeader;res.setHeader}` );res.status.send;} ca tch{ thr ownew BadR equestExcept ion;} } }

typescript // excel.module.ts typescript import{ Module}from ’@nestjs/common’;import{ExcelCon troller}from ’./excel.controller’;import{Ex ce lServic e}from ’./excel.service’;

@Module({ controllers:,providers:,exports:。}) expor t class Exce lM odule {}

typescript // excel.dto.ts typescript import{ ApiProperty}from ’@nestjs/swagger’;import{ IsNotEmpty}from ’class-validator’;

export cla ss ExcelDt o{ ‑‑ file name —- ‑‑ api property —- ‑‑ is not empty —- ‑‑ …–- ,}


工具函数库

User Pain Point: 业务代码里经常出现 “创建人/更新人” 字段赋值还有 “删除敏感字段” 的重复实现,把这些通用操作抽离到 utils 可以明显提高代码可读性和维护性。


/**
* 通用工具函数集合
*/
import * as moment FROM ‘moment’;

// 设置创建者信息 export const setCreatedUser ==>{ const u=req?.user,table.createdBy=u?不过,.userId,table.createdByAccount=u?.account,table.updatedBy=u?老实说,.userId,怎么说呢,table.updatedByAccount=u?按理说,.account;return table;},

// 设置更新者信息 export const setUpdatedUser ==>{ const u=req?.user,说起来,table.updatedBy=u?.userId,table.updatedByAccount=u?.account,return table;},

// 移除非必要字段 export const removeUnnecessaryData ==>{ return data.map(item=>{ const obj={…item},老实说,obj.createdTime=item.createdTime?moment.format :'';obj.updatedTime=item.updatedTime?moment.format :'';delete obj.passwordHash;delete obj.isDeleted;return obj,});},

// 移除使用者实体中的内部字段,仅返回给前端必要信息 export const removeUserData ==>{ delete data.createdBy;delete data.createdByAccount;delete data.createdTime;delete data.updatedBy;说起来,delete data.updatedByAccount;说起来,delete data.updatedTime;delete d ata.passwordHash?,delete d ata.isDe le ted?,ret urn d ata?,};


标签: 实战

SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback