AWS Cognito沙箱模式下OTP短信发送失败排查求助
AWS Cognito沙箱模式下OTP短信发送失败排查方案
我在AWS中创建了用于手机号OTP验证的用户池,使用以下代码调用signUp接口发送OTP:
import { CognitoIdentityServiceProvider } from "aws-sdk"; const cognito = new CognitoIdentityServiceProvider({ region: "ca-central-1", }); const userPoolId = "ca-central-xxx"; const appClientId = "xxx"; export async function sendOTP(phoneNumber: string, password: string) { const params = { ClientId: appClientId, Username: phoneNumber, Password: password, UserAttributes: [ { Name: "phone_number", Value: phoneNumber, }, ], }; return cognito.signUp(params).promise(); }
调用后返回成功响应:
{ "UserConfirmed": false, "CodeDeliveryDetails": { "Destination": "+********2004", "DeliveryMedium": "SMS", "AttributeName": "phone_number" }, "UserSub": "8cdd9528-a001-70fc-f556-xxxx" }
但实际未收到OTP短信,控制台显示发送失败,初期能发送后续停止,处于沙箱模式且手机号已验证,更换用户池和IAM角色无效。
以下是排查问题的可能原因:
- 沙箱模式短信配额耗尽:AWS SNS沙箱默认每日短信发送额度极低(加拿大区域通常为100条/天),初期发送成功后续停止大概率是配额用完。前往SNS控制台「短信偏好设置」查看配额使用情况,若耗尽可申请提升配额。
- 短信模板不符合沙箱要求:沙箱模式下短信必须包含退订提示(如加拿大需符合CRTC规定,结尾添加「回复STOP取消订阅」类内容)。检查用户池「消息自定义」中的短信验证模板,若为自定义模板需确认包含合规退订说明。
- 手机号格式不规范:确保传入的手机号严格遵循E.164标准(加拿大号码为
+1XXXYYYYYYY格式),即使Cognito返回成功响应,格式错误仍可能导致运营商拒收。 - SNS沙箱号码验证状态异常:确认目标手机号在SNS控制台「已验证号码」列表中,且状态为正常验证状态,避免出现验证过期或未正确关联的情况。
- 运营商拦截或区域兼容性问题:部分运营商可能将AWS发送的短信标记为垃圾短信,检查手机短信拦截设置;或尝试更换同区域其他运营商的手机号测试,排除区域运营商兼容性问题。
- Cognito角色权限配置错误:检查用户池关联的SNS角色,确认信任策略允许
cognito-idp.amazonaws.com扮演该角色,且权限策略包含sns:Publish权限,同时覆盖目标手机号所在区域的SNS资源。 - 查看CloudWatch日志定位具体错误:开启用户池「监控」中的CloudWatch日志,前往对应日志组查看Cognito发送短信的详细日志,日志中会包含SNS返回的具体错误码(如
MessageRejected、InvalidParameter),帮助精准定位问题。
内容的提问来源于stack exchange,提问作者Naveed Ali Rehmani
相关产品推荐
相关产品推荐

