具体步骤
- 安装依赖
pnpm add svg-captcha
在控制器中使用
import { Controller, Get, Res, Session } from '@nestjs/common'; import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; // swagger 接口文档 import { Response } from 'express'; import svgCaptcha from 'svg-captcha'; import { VerifyCodeResponseDto } from './dto/response-auth.dto'; @ApiTags('身份鉴权') @Controller('auth') export class AuthController { /** * @description: 获取图形验证码 */ @Get('captcha') //当请求该接口时,返回一张随机图片验证码 @ApiOkResponse({ type: VerifyCodeResponseDto }) @ApiOperation({ summary: '获取图形验证码' }) async getCaptcha(@Session() session: Api.Common.SessionInfo, @Res() res: Response) { const captcha = svgCaptcha.createMathExpr({ //可配置返回的图片信息 size: 4, // 验证码长度 ignoreChars: '0oO1ilI', // 验证码字符中排除 0oO1ilI noise: 2, // 干扰线条的数量 width: 132, height: 40, fontSize: 50, color: true, // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有 background: '#fff', }); session.captchaCode = captcha.text; //使用session保存验证,用于登陆时验证 res.type('image/svg+xml'); //指定返回的类型 return res.send(captcha.data); //给页面返回一张图片 } }
更多详细文档:svg-captcha
Session 验证
在客户端登录的时候,我们就能根据传过来的验证码与 Session
中的信息判断是否正确:
/**
* @description: 用户登录
*/
async login(params: LoginParamsDto, session: Api.Common.SessionInfo) {
// 获取验证码
const {
captchaCode } = params;
// 判断验证码
if (captchaCode.toUpperCase() !== session.captchaCode.toUpperCase()) {
return responseMessage(null, '验证码错误', -1);
}
// 验证成功,返回 token
return responseMessage(tokens);
}