forked from Yara724/api
Fixed captcha for prod
This commit is contained in:
@@ -12,49 +12,40 @@ import { HashService } from "src/utils/hash/hash.service";
|
||||
|
||||
@Injectable()
|
||||
export class CaptchaChallengeService {
|
||||
private readonly isDev: boolean;
|
||||
|
||||
constructor(
|
||||
private readonly captchaService: CaptchaService,
|
||||
private readonly hashService: HashService,
|
||||
private readonly captchaChallengeDbService: CaptchaChallengeDbService,
|
||||
private readonly configService: ConfigService,
|
||||
) {}
|
||||
) {
|
||||
this.isDev = this.configService.get<string>("NODE_ENV") === "development";
|
||||
}
|
||||
|
||||
async issue(): Promise<CaptchaResponseDto> {
|
||||
const generated = this.captchaService.generate();
|
||||
const captchaId = randomUUID();
|
||||
|
||||
if (this.configService.get<string>("NODE_ENV") === "development") {
|
||||
// Always hash and persist the answer — the env check was the root bug
|
||||
const answerHash = await this.hashService.hash(
|
||||
this.captchaService.normalizeAnswer(generated.text),
|
||||
);
|
||||
const result = {
|
||||
|
||||
await this.captchaChallengeDbService.create({
|
||||
captchaId,
|
||||
answerHash:
|
||||
this.configService.get<string>("NODE_ENV") === "development"
|
||||
? answerHash
|
||||
: "",
|
||||
answerHash,
|
||||
image: generated.image,
|
||||
expiresAt: generated.expiresAt,
|
||||
expireAt: new Date(generated.expiresAt),
|
||||
usedAt: null,
|
||||
};
|
||||
}
|
||||
|
||||
const result = {
|
||||
captchaId,
|
||||
image: generated.image,
|
||||
expiresAt: generated.expiresAt,
|
||||
expireAt: new Date(generated.expiresAt),
|
||||
usedAt: null,
|
||||
};
|
||||
|
||||
await this.captchaChallengeDbService.create(result);
|
||||
});
|
||||
|
||||
return {
|
||||
captchaId,
|
||||
text: generated.text /* TODO: REMOVE THIS FOR PROD*/,
|
||||
image: generated.image,
|
||||
expiresAt: generated.expiresAt,
|
||||
...(this.isDev && { text: generated.text }),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -3,15 +3,13 @@ import { ConfigService } from "@nestjs/config";
|
||||
import * as svgCaptcha from "svg-captcha";
|
||||
|
||||
export interface GeneratedCaptcha {
|
||||
text?: string;
|
||||
text: string;
|
||||
image: string;
|
||||
expiresAt: number;
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class CaptchaService {
|
||||
constructor(private readonly configService: ConfigService) {}
|
||||
|
||||
generate(): GeneratedCaptcha {
|
||||
const captcha = svgCaptcha.create({
|
||||
size: 5,
|
||||
@@ -24,13 +22,6 @@ export class CaptchaService {
|
||||
fontSize: 52,
|
||||
});
|
||||
|
||||
if (this.configService.get<string>("NODE_ENV") === "production") {
|
||||
return {
|
||||
image: `data:image/svg+xml;base64,${Buffer.from(captcha.data, "utf8").toString("base64")}`,
|
||||
expiresAt: this.buildExpireAt(),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
text: captcha.text,
|
||||
image: `data:image/svg+xml;base64,${Buffer.from(captcha.data, "utf8").toString("base64")}`,
|
||||
|
||||
Reference in New Issue
Block a user