fix(auth): 参照rwdurian实现重写AliyunSmsProvider

使用 sendSmsWithOptions + RuntimeOptions 替代 sendSms,
与 rwdurian identity-service 已验证的实现保持一致。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-24 01:00:30 -08:00
parent 9c2e8b8024
commit 6e6723a664
1 changed files with 22 additions and 11 deletions

View File

@ -5,8 +5,8 @@ import { ISmsProvider, SmsDeliveryResult } from './sms-provider.interface';
/**
* SMS Provider
*
* 使 (dysmsapi)
* 需要安装: npm install @alicloud/dysmsapi20170525 @alicloud/openapi-client
* rwdurian identity-service
* 使 sendSmsWithOptions + RuntimeOptions API
*
* :
* - ALIYUN_ACCESS_KEY_ID
@ -36,28 +36,40 @@ export class AliyunSmsProvider implements ISmsProvider {
const templateCode = this.getTemplateCode(type);
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { SendSmsRequest } = require('@alicloud/dysmsapi20170525');
const request = new SendSmsRequest({
const Dysmsapi = require('@alicloud/dysmsapi20170525');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const $Util = require('@alicloud/tea-util');
const sendSmsRequest = new Dysmsapi.SendSmsRequest({
phoneNumbers: phoneNumber,
signName,
templateCode,
templateParam,
});
const result = await client.sendSms(request);
if (result.body?.code === 'OK') {
const runtime = new $Util.RuntimeOptions({
connectTimeout: 15000,
readTimeout: 15000,
});
const response = await client.sendSmsWithOptions(sendSmsRequest, runtime);
if (response.body?.code === 'OK') {
this.logger.log(
`SMS sent: phone=${phone.slice(0, 3)}****${phone.slice(-4)} bizId=${response.body.bizId}`,
);
return {
success: true,
providerId: result.body.bizId,
providerId: response.body.bizId,
};
}
this.logger.error(
`Aliyun SMS failed: ${result.body?.code} - ${result.body?.message}`,
`Aliyun SMS failed: ${response.body?.code} - ${response.body?.message}`,
);
return {
success: false,
errorMsg: `${result.body?.code}: ${result.body?.message}`,
errorMsg: `${response.body?.code}: ${response.body?.message}`,
};
} catch (error: any) {
this.logger.error(`Aliyun SMS error: ${error.message}`);
@ -66,14 +78,12 @@ export class AliyunSmsProvider implements ISmsProvider {
}
private getTemplateCode(type: SmsVerificationType): string {
// 可为不同类型配置不同模板,默认使用通用模板
return process.env.ALIYUN_SMS_TEMPLATE_CODE || '';
}
private async getClient() {
if (this.client) return this.client;
// 动态 require (仅 SMS_ENABLED=true 时调用, 开发环境不安装这些包)
// eslint-disable-next-line @typescript-eslint/no-var-requires
const Dysmsapi20170525 = require('@alicloud/dysmsapi20170525').default;
// eslint-disable-next-line @typescript-eslint/no-var-requires
@ -86,6 +96,7 @@ export class AliyunSmsProvider implements ISmsProvider {
});
this.client = new Dysmsapi20170525(config);
this.logger.log('Aliyun SMS client initialized');
return this.client;
}
}