mirror of
https://github.com/certd/certd.git
synced 2026-08-07 06:18:04 +08:00
chore: format
This commit is contained in:
@@ -10,7 +10,6 @@ import { PasskeyEntity } from "../entity/passkey.js";
|
||||
@Provide()
|
||||
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
||||
export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
|
||||
@Inject()
|
||||
userService: UserService;
|
||||
|
||||
@@ -25,7 +24,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
}
|
||||
|
||||
async getRpInfo() {
|
||||
let rpName = "Certd"
|
||||
let rpName = "Certd";
|
||||
if (isComm()) {
|
||||
const siteInfo = await this.sysSettingsService.getSetting<SysSiteInfo>(SysSiteInfo);
|
||||
rpName = siteInfo.title || rpName;
|
||||
@@ -42,7 +41,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
rpName,
|
||||
rpId,
|
||||
origin,
|
||||
}
|
||||
};
|
||||
}
|
||||
async generateRegistrationOptions(userId: number, username: string, remoteIp: string, ctx: any) {
|
||||
const { generateRegistrationOptions } = await import("@simplewebauthn/server");
|
||||
@@ -50,7 +49,6 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
|
||||
const { rpName, rpId } = await this.getRpInfo();
|
||||
|
||||
|
||||
const options = await generateRegistrationOptions({
|
||||
rpName: rpName,
|
||||
rpID: rpId,
|
||||
@@ -60,15 +58,15 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
timeout: 60000,
|
||||
attestationType: "none",
|
||||
excludeCredentials: [],
|
||||
preferredAuthenticatorType: 'localDevice',
|
||||
preferredAuthenticatorType: "localDevice",
|
||||
authenticatorSelection: {
|
||||
authenticatorAttachment: "cross-platform",
|
||||
userVerification: "preferred",
|
||||
authenticatorAttachment: "cross-platform",
|
||||
userVerification: "preferred",
|
||||
residentKey: "preferred",
|
||||
requireResidentKey: false
|
||||
requireResidentKey: false,
|
||||
},
|
||||
});
|
||||
logger.info('[passkey] 注册选项:', JSON.stringify(options));
|
||||
logger.info("[passkey] 注册选项:", JSON.stringify(options));
|
||||
cache.set(`passkey:registration:${options.challenge}`, userId, {
|
||||
ttl: 5 * 60 * 1000,
|
||||
});
|
||||
@@ -78,12 +76,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
};
|
||||
}
|
||||
|
||||
async verifyRegistrationResponse(
|
||||
userId: number,
|
||||
response: any,
|
||||
challenge: string,
|
||||
ctx: any
|
||||
) {
|
||||
async verifyRegistrationResponse(userId: number, response: any, challenge: string, ctx: any) {
|
||||
const { verifyRegistrationResponse } = await import("@simplewebauthn/server");
|
||||
|
||||
const storedUserId = cache.get(`passkey:registration:${challenge}`);
|
||||
@@ -105,13 +98,12 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
verification = await verifyRegistrationResponse(verifyReq);
|
||||
} catch (error) {
|
||||
// 后端验证时
|
||||
logger.error('[passkey] 注册验证失败:', JSON.stringify(verifyReq));
|
||||
logger.error("[passkey] 注册验证失败:", JSON.stringify(verifyReq));
|
||||
throw new AuthException(`注册验证失败:${error.message || error}`);
|
||||
}
|
||||
if (!verification.verified) {
|
||||
throw new AuthException("注册验证失败");
|
||||
}
|
||||
|
||||
|
||||
cache.delete(`passkey:registration:${challenge}`);
|
||||
|
||||
@@ -129,7 +121,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
rpID: rpId,
|
||||
timeout: 60000,
|
||||
allowCredentials: [],
|
||||
userVerification: 'preferred' //'required' | 'preferred' | 'discouraged';
|
||||
userVerification: "preferred", //'required' | 'preferred' | 'discouraged';
|
||||
});
|
||||
|
||||
// cache.set(`passkey:authentication:${options.challenge}`, userId, {
|
||||
@@ -141,11 +133,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
};
|
||||
}
|
||||
|
||||
async verifyAuthenticationResponse(
|
||||
credential: any,
|
||||
challenge: string,
|
||||
ctx: any
|
||||
) {
|
||||
async verifyAuthenticationResponse(credential: any, challenge: string, ctx: any) {
|
||||
const { verifyAuthenticationResponse } = await import("@simplewebauthn/server");
|
||||
|
||||
const passkey = await this.repository.findOne({
|
||||
@@ -168,7 +156,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
requireUserVerification: false,
|
||||
credential: {
|
||||
id: passkey.passkeyId,
|
||||
publicKey: new Uint8Array(Buffer.from(passkey.publicKey, 'base64')),
|
||||
publicKey: new Uint8Array(Buffer.from(passkey.publicKey, "base64")),
|
||||
counter: passkey.counter,
|
||||
transports: passkey.transports as any,
|
||||
},
|
||||
@@ -187,24 +175,13 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
};
|
||||
}
|
||||
|
||||
async registerPasskey(
|
||||
userId: number,
|
||||
response: any,
|
||||
challenge: string,
|
||||
deviceName: string,
|
||||
ctx: any
|
||||
) {
|
||||
const verification = await this.verifyRegistrationResponse(
|
||||
userId,
|
||||
response,
|
||||
challenge,
|
||||
ctx
|
||||
);
|
||||
async registerPasskey(userId: number, response: any, challenge: string, deviceName: string, ctx: any) {
|
||||
const verification = await this.verifyRegistrationResponse(userId, response, challenge, ctx);
|
||||
|
||||
await this.add({
|
||||
userId,
|
||||
passkeyId: verification.credentialId,
|
||||
publicKey: Buffer.from(verification.credentialPublicKey).toString('base64'),
|
||||
publicKey: Buffer.from(verification.credentialPublicKey).toString("base64"),
|
||||
counter: verification.counter,
|
||||
deviceName,
|
||||
registeredAt: Date.now(),
|
||||
@@ -214,11 +191,7 @@ export class PasskeyService extends BaseService<PasskeyEntity> {
|
||||
}
|
||||
|
||||
async loginByPasskey(credential: any, challenge: string, ctx: any) {
|
||||
const verification = await this.verifyAuthenticationResponse(
|
||||
credential,
|
||||
challenge,
|
||||
ctx
|
||||
);
|
||||
const verification = await this.verifyAuthenticationResponse(credential, challenge, ctx);
|
||||
|
||||
const passkey = await this.repository.findOne({
|
||||
where: {
|
||||
|
||||
Reference in New Issue
Block a user