forked from yoone/API
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { Provide } from '@midwayjs/core';
|
|
import { InjectEntityModel } from '@midwayjs/typeorm';
|
|
import { Repository } from 'typeorm';
|
|
import { AuthCode } from '../entity/auth_code';
|
|
|
|
@Provide()
|
|
export class AuthCodeService {
|
|
@InjectEntityModel(AuthCode)
|
|
authCodeModel: Repository<AuthCode>;
|
|
|
|
private generateCodeNumber() {
|
|
return Math.floor(100000 + Math.random() * 900000).toString();
|
|
}
|
|
|
|
// 生成并保存验证码
|
|
async generateCode(deviceId: string): Promise<string> {
|
|
const code = this.generateCodeNumber();
|
|
const expiresAt = new Date(Date.now() + 10 * 60 * 1000); // 10分钟有效期
|
|
|
|
await this.authCodeModel.save({
|
|
device_id: deviceId,
|
|
code,
|
|
expires_at: expiresAt
|
|
});
|
|
|
|
return code;
|
|
}
|
|
|
|
// 校验验证码
|
|
async verifyCode(deviceId: string, code: string): Promise<boolean> {
|
|
const record = await this.authCodeModel.findOne({
|
|
where: { device_id: deviceId },
|
|
});
|
|
if (!record) return false;
|
|
|
|
if (record.expires_at.getTime() < Date.now()) {
|
|
await this.authCodeModel.delete({ device_id: deviceId });
|
|
return false;
|
|
}
|
|
|
|
if (record.code !== code) return false;
|
|
|
|
await this.authCodeModel.delete({ device_id: deviceId });
|
|
return true;
|
|
}
|
|
}
|