WSO2 IS 5.10.0传参跳过登录页认证后SMS OTP页面返回401错误
问题根因
WSO2 IS 5.10.0 版本直接在/oauth2/authorize接口URL携带账号密码触发认证时,存在两个明确问题会导致后续SMS OTP环节返回401:
- 基础认证器默认不会为URL传参的认证请求持久化完整会话上下文:手动在默认登录页提交账号密码时,框架会在认证成功后向当前会话写入跨认证端点的合法鉴权标记、同步认证上下文到后续认证步骤;直接URL传参走认证时,默认逻辑仅完成账号密码校验,不会向后续SMS OTP端点传递合法会话凭证,SMS OTP端点校验会话合法性失败就会返回401。
- URL传参触发链路时存在参数重复拼接bug:你贴出的SMS OTP跳转URL中
sp=User Portal、isSaaSApp=false两个参数各重复出现两次,会导致端点参数解析时取到异常值,触发鉴权拦截。
可落地修复方案
快速验证方案(无需改配置/源码)
不要用GET请求在authorize接口明文传账号密码,改用标准POST提交方式走认证流程:
- 先发起不带
username、password参数的普通/oauth2/authorize请求,从响应中提取返回的sessionDataKey参数,同时保存响应头Set-Cookie里的commonAuthId会话值 - 构造POST请求到
/commonauth端点,请求体携带以下参数,同时带上一步拿到的commonAuthIdcookie:sessionDataKey=<第一步提取的会话key值> username=test password=test@123 authenticator=BasicAuthenticator type=oidc - 基础认证完成后得到302跳转响应时,完整携带该响应返回的所有Cookie值访问跳转后的SMS OTP地址,即可正常加载验证页面。
永久修复方案(修改配置一劳永逸)
- 打开WSO2 IS部署目录下的配置文件:
<IS_HOME>/repository/conf/identity/application-authentication.xml - 找到
BasicAuthenticator的配置节点,新增两个参数开启URL传参的上下文持久化能力:<Authenticator name="BasicAuthenticator" enabled="true"> <!-- 原有配置保留 --> <Parameter name="ProcessUrlParams">true</Parameter> <Parameter name="PersistAuthContextOnUrlAuth">true</Parameter> </Authenticator> - 保存配置后重启WSO2 IS服务,原有带
username、password参数的authorize请求即可正常走完Basic Auth+SMS OTP的全链路,不会再出现401错误。
兜底排查点
如果上述操作完成后仍报401,检查SMS OTP端点的访问校验逻辑:打开<IS_HOME>/repository/deployment/server/webapps/oauth2/smsotpauthenticationendpoint/smsotp.jsp,确认文件头部的会话校验逻辑没有拦截框架内部的302跳转请求,把Cookie非空校验的拦截规则放宽,允许认证链路的内部跳转请求访问即可。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

