feat(login): Add verification code login functionality
- Add verification code login endpoint to support passwordless authentication via email or phone - Add send login verification code endpoint to initiate verification code delivery - Implement verificationCodeLogin method in LoginService to handle verification code authentication - Implement sendLoginVerificationCode method in LoginService to send verification codes to users - Add VerificationCodeLoginRequest and related DTOs to support new login flow - Add VerificationCodeLoginDto and SendLoginVerificationCodeDto for API request validation - Implement verificationCodeLogin and sendLoginVerificationCode in LoginCoreService - Add comprehensive Swagger documentation for new endpoints with proper status codes and responses - Support test mode for verification code delivery with 206 Partial Content status - Fix UsersService dependency injection in test specifications to use string token - Enhance authentication options by providing passwordless login alternative to traditional password-based authentication
This commit is contained in:
@@ -47,7 +47,7 @@ export interface VerificationEmailOptions {
|
||||
/** 用户昵称 */
|
||||
nickname?: string;
|
||||
/** 验证码用途 */
|
||||
purpose: 'email_verification' | 'password_reset';
|
||||
purpose: 'email_verification' | 'password_reset' | 'login_verification';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -167,9 +167,15 @@ export class EmailService {
|
||||
if (purpose === 'email_verification') {
|
||||
subject = '【Whale Town】邮箱验证码';
|
||||
template = this.getEmailVerificationTemplate(code, nickname);
|
||||
} else {
|
||||
} else if (purpose === 'password_reset') {
|
||||
subject = '【Whale Town】密码重置验证码';
|
||||
template = this.getPasswordResetTemplate(code, nickname);
|
||||
} else if (purpose === 'login_verification') {
|
||||
subject = '【Whale Town】登录验证码';
|
||||
template = this.getLoginVerificationTemplate(code, nickname);
|
||||
} else {
|
||||
subject = '【Whale Town】验证码';
|
||||
template = this.getEmailVerificationTemplate(code, nickname);
|
||||
}
|
||||
|
||||
return await this.sendEmail({
|
||||
@@ -322,6 +328,68 @@ export class EmailService {
|
||||
</html>`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取登录验证码模板
|
||||
*
|
||||
* @param code 验证码
|
||||
* @param nickname 用户昵称
|
||||
* @returns HTML模板
|
||||
*/
|
||||
private getLoginVerificationTemplate(code: string, nickname?: string): string {
|
||||
return `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>登录验证码</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
||||
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
|
||||
.header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; border-radius: 10px 10px 0 0; }
|
||||
.content { background: #f9f9f9; padding: 30px; border-radius: 0 0 10px 10px; }
|
||||
.code-box { background: #fff; border: 2px dashed #667eea; padding: 20px; text-align: center; margin: 20px 0; border-radius: 8px; }
|
||||
.code { font-size: 32px; font-weight: bold; color: #667eea; letter-spacing: 5px; }
|
||||
.footer { text-align: center; margin-top: 20px; color: #666; font-size: 12px; }
|
||||
.info { background: #e3f2fd; border: 1px solid #bbdefb; padding: 15px; border-radius: 5px; margin: 20px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h1>🔐 登录验证码</h1>
|
||||
<p>Whale Town 安全登录</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<h2>你好${nickname ? ` ${nickname}` : ''}!</h2>
|
||||
<p>您正在使用验证码登录 Whale Town。请使用以下验证码完成登录:</p>
|
||||
|
||||
<div class="code-box">
|
||||
<div class="code">${code}</div>
|
||||
<p style="margin: 10px 0 0 0; color: #666;">登录验证码</p>
|
||||
</div>
|
||||
|
||||
<div class="info">
|
||||
<strong>📱 使用说明:</strong>
|
||||
<ul style="margin: 10px 0 0 20px;">
|
||||
<li>验证码 5 分钟内有效</li>
|
||||
<li>请在登录页面输入此验证码</li>
|
||||
<li>验证码仅限本次登录使用</li>
|
||||
<li>请勿将验证码泄露给他人</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<p>如果您没有尝试登录,请忽略此邮件,或联系客服确认账户安全。</p>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<p>此邮件由系统自动发送,请勿回复</p>
|
||||
<p>© 2025 Whale Town Game. All rights reserved.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>`;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取欢迎邮件模板
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user