You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WSO2 IS自定义单表用户存储中向用户发送OTP?

自定义用户存储实现手机号OTP发送解决方案

针对你基于UniqueIDJDBCUserStoreManager实现自定义用户存储后无法发送手机号OTP的问题,核心原因是WSO2 IS无法从你的自定义存储中正确获取用户手机号,或相关配置缺失。以下是具体实现步骤:

一、重写用户Claim属性获取方法

WSO2 IS通过标准Claim URI(http://wso2.org/claims/mobile)获取用户手机号,你需要在自定义用户存储类中重写以下方法,确保返回正确的手机号值:

1. 重写getUserClaimValue方法

@Override
public String getUserClaimValue(String userName, String claimURI, String profileName) throws UserStoreException {
    // 匹配手机号Claim URI
    if ("http://wso2.org/claims/mobile".equals(claimURI)) {
        // 从你的用户表中查询手机号(替换为实际数据库列名,比如mobile)
        String sql = "SELECT mobile FROM your_user_table WHERE username = ?";
        try (PreparedStatement stmt = getDBConnection().prepareStatement(sql)) {
            stmt.setString(1, userName);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                return rs.getString("mobile");
            }
        } catch (SQLException e) {
            throw new UserStoreException("Failed to retrieve mobile number for user: " + userName, e);
        }
        return null;
    }
    // 其他Claim交给父类处理
    return super.getUserClaimValue(userName, claimURI, profileName);
}

2. 重写getUserClaimValues方法(批量获取场景)

@Override
public Map<String, String> getUserClaimValues(String userName, String[] claimURIs, String profileName) throws UserStoreException {
    Map<String, String> claimValues = super.getUserClaimValues(userName, claimURIs, profileName);
    // 检查是否需要返回手机号Claim
    for (String uri : claimURIs) {
        if ("http://wso2.org/claims/mobile".equals(uri)) {
            claimValues.put(uri, getUserClaimValue(userName, uri, profileName));
            break;
        }
    }
    return claimValues;
}

二、配置用户存储Claim映射

在WSO2 IS管理控制台完成Claim映射配置:

  • 进入用户和角色 > 用户存储 > 你的自定义用户存储
  • 切换到Claim Configuration标签页,点击Add Claim Mapping
  • 选择http://wso2.org/claims/mobile作为WSO2 Claim,映射到你数据库中的手机号列名(比如mobile)
  • 勾选Supported,根据需求设置Required和Read Only属性

三、配置SMS发送器

在<IS_HOME>/repository/conf/deployment.toml中配置SMS服务提供商(以Twilio为例):

[notification.sms]
sender_type = "twilio"

[notification.sms.twilio]
account_sid = "你的Twilio账户SID"
auth_token = "你的Twilio认证Token"
from_number = "你的Twilio发送号码"

如果使用自定义SMS服务,需实现org.wso2.carbon.identity.governance.notification.sender.sms.SMSSender接口,并在配置文件中指定自定义实现类。

四、启用手机号OTP认证

在管理控制台完成OTP开关配置:

  • 进入Identity Providers > Resident > Authentication > Multi-factor Authentication
  • 启用SMS OTP,配置OTP长度、有效期等参数
  • 确保User Store Claim选择http://wso2.org/claims/mobile

五、测试与排查

  • 开启DEBUG日志,查看org.wso2.carbon.identity.authenticator.smsotp和自定义用户存储类的日志,确认手机号是否被正确获取
  • 验证数据库中用户的手机号字段不为空,且格式符合SMS发送要求

内容的提问来源于stack exchange,提问作者abdullah tariq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:10:29