跳转至

LoginController(登录控制器)

cn.myapps.signon.auth.controller.LoginController,类级 @RequestMapping("${myapps.context-path.signon:}")@Tag("登录控制器")。提供账号密码登录、SSO/CAS/OIDC 登录、微信/钉钉扫码登录、短信验证码登录与注册、代理用户登录、自动登录、企业域列表查询、多语言词列表、accessToken 换取与刷新、密码找回、首页重定向等认证端点。

控制器基址:${myapps.context-path.signon:}(部署时替换;lite 统一打包下前缀多一层 /signon)。下列「请求路径」为相对基址的路径。完整 URL = {signon-context}<相对路径>

鉴权:本控制器全部端点位于认证服务内,均不要求 accessToken/api/runtime/login/** 命中 PassFilter 白名单;/conn_test//api/login/exchangeAccessToken/api/domains/api/refreshAccessTokenlogout/sso 不在白名单,但 CommonSecurityFilter 不做 token 校验,仍可匿名访问。仅当部署方启用 CAS SSO 时,OBPMAuthenticationFilter 会对未持 CAS 断言的请求重定向到 CAS 登录页(详见 index.md 鉴权说明)。

响应形态:本控制器多数端点使用 result(...) 自定义包装(resultCode/msg + 动态数据键),getDomains 使用 success/error 包装(status/message/data),部分端点返回原始 JSONObject 或 HTML/JS 字符串。各端点「响应」小节单独说明,不引用统一 Resource


1. 连接测试

返回固定 JSON 字符串,用于探活。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/conn_test(完整:{signon-context}/conn_test
  • 鉴权:否
  • Tag:登录控制器

请求参数

无。

请求示例

GET /conn_test HTTP/1.1

响应

结构@ResponseBody 返回字符串,内容为固定 JSON 文本(Content-Type: text/plainapplication/json,依协商)。

成功示例

{"status":0, "message":"ok"}


2. 首页重定向

根据 authentication.type 配置重定向到本地登录页或 SSO 登录页。

  • 接口类型:页面视图(@ResponseBody 返回 HTML/JS 字符串)
  • 请求方式GET
  • 请求路径/(完整:{signon-context}/
  • 鉴权:否
  • Tag:登录控制器

请求参数

无。

请求示例

GET / HTTP/1.1

响应

结构:返回一段由浏览器执行的 JavaScript,将当前页面跳转到登录页或 SSO 授权端点。

  • authentication.type=ssosso.implementation 为 OIDC(OidcSSO)时:先从 oidc.ldap.wellKnownUrlauthorization_endpoint,构造 authorization_endpoint?response_type=code&client_id=<oidc.ldap.clientId>&redirect_uri=<sso.redirect>&scope=openid profile email,跳转到该 URL。
  • 否则跳转到 login.html
  • 若计算出的 URL 未通过 SecurityURL.isSafeUrl 安全校验,回退到 login.html

成功示例

<script>window.location='login.html'</script>


3. 换取 accessToken

根据 checkInTokendomainIddomainName 换取正式 accessToken

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/login/exchangeAccessToken(完整:{signon-context}/api/login/exchangeAccessToken
  • 鉴权:否(需持有效的 checkInToken,由 checkin 端点签发)
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
requestBody body JSON string 请求体为 JSON 字符串,控制器内再解析

请求体字段

字段 类型 必填 说明
checkInToken string checkin 端点签发的中间令牌,JWT 内 username:domainIds
domainId string 二选一 企业域 ID
domainName string 二选一 企业域名称

请求示例

POST /api/login/exchangeAccessToken HTTP/1.1
Content-Type: application/json

{"checkInToken":"<jwt>","domainName":"默认域"}

响应

结构result(...) 自定义包装。

成功示例

{ "resultCode": "0", "msg": "ok", "accessToken": "<accessToken jwt>" }

失败示例

{ "resultCode": "400", "msg": "domainId 或 domainName 必须填写" }
{ "resultCode": "400", "msg": "用户不存在" }


4. SSO 登录处理

处理 SSO 单点登录回调,校验 SSO 票据并签发 accessToken,写入 cookie 后跳转到分发页。

  • 接口类型:页面视图(@ResponseBody 返回 HTML/JS 字符串)
  • 请求方式GET
  • 请求路径/api/login/sso(完整:{signon-context}/api/login/sso
  • 鉴权:否
  • Tag:登录控制器

请求参数

由 SSO 实现回调时携带(如 CAS ticket、OIDC code 等),具体参数由 SSOUtil.checkSSO 解析。

请求示例

GET /api/login/sso?ticket=<CAS票>&... HTTP/1.1

响应

结构:HTML/JS 字符串。

  • authentication.type != sso 时,服务端 response.sendRedirect("login.html")(无响应体)。
  • 当 SSO 校验成功(userinfo 形如 <loginno>@<domainName>loginno 可含 # 前缀),签发 accessToken 并通过 Set-Cookie: accessToken=<jwt> 下发,返回跳转脚本。
  • 失败返回字符串 error

成功示例

Set-Cookie: accessToken=<jwt>; Path=/; HttpOnly
<script>window.location='/static/signon/dispatcher.html'</script>


5. SSO 注销

注销当前登录态并跳转到 SSO 注销重定向地址。

  • 接口类型:页面视图(@ResponseBody 返回 HTML/JS 字符串)
  • 请求方式POST
  • 请求路径logout/sso(完整:{signon-context}/logout/sso;方法级 @PostMapping("logout/sso") 无前导斜杠)
  • 鉴权:否
  • Tag:登录控制器

请求参数

无。

请求示例

POST /logout/sso HTTP/1.1

响应

结构:HTML/JS 字符串。先调 LoginHelper.logout 失效 session、清空 cookie,再读取 sso.logout.redirect 配置,若未通过 SecurityURL.isSafeUrl 校验则回退 login.html,返回跳转脚本。

成功示例

<script>window.location='<注销重定向URL>'</script>


6. 获取代理用户列表

获取指定用户 ID 的代理用户列表(仅返回代理日期有效内的代理人)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/runtime/login/getProxyUsers/{userid}(完整:{signon-context}/api/runtime/login/getProxyUsers/{userid}
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
userid path string 被代理的用户 ID

请求示例

GET /api/runtime/login/getProxyUsers/1a2b3c HTTP/1.1

响应

结构result(...) 自定义包装。proxyUsers 为对象数组,元素仅含 id/name/avatar 三个字段。

成功示例

{
  "resultCode": "0",
  "msg": "",
  "returnUrl": "",
  "proxyUsers": [
    { "id": "<用户ID>", "name": "<用户名>", "avatar": "<头像URL>" }
  ]
}


7. 代理用户登录

以代理用户身份登录系统,签发该代理用户的 accessToken。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/runtime/login/loginProxy/{userid}/{path}(完整:{signon-context}/api/runtime/login/loginProxy/{userid}/{path}
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
userid path string 代理用户 ID(代理人本人)
path path string 登录后跳转的应用上下文路径

请求示例

GET /api/runtime/login/loginProxy/1a2b3c/portal HTTP/1.1

响应

结构result(...) 自定义包装。成功时通过 Set-Cookie: accessToken=<jwt> 下发。

成功示例

{ "resultCode": "1", "msg": "登录成功", "returnUrl": "/static/signon/dispatcher.html" }

失败示例

{ "resultCode": "0", "msg": "登录失败", "returnUrl": "" }


8. 更改验证码图片

生成新的验证码图片(base64),并把校验码写入登录缓存。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/changeCheckcodeImg(完整:{signon-context}/api/runtime/login/changeCheckcodeImg
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
username query string 账号名;作为缓存 key 区分用户的验证码

请求示例

POST /api/runtime/login/changeCheckcodeImg?username=admin HTTP/1.1

响应

结构result(...) 自定义包装。checkcodedata:image/jpg;base64,... 形式的图片。

成功示例

{ "resultCode": "1", "msg": "改变成功", "checkcode": "data:image/jpg;base64,/9j/4AAQ..." }


9. 自动登录

依据 cookie 中的自动登录票据尝试自动登录。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/autologin(完整:{signon-context}/api/runtime/login/autologin
  • 鉴权:否(依赖 CookieAuthValidator 校验 cookie 票据)
  • Tag:登录控制器

请求参数

无(从请求 cookie 中读取自动登录票据)。

请求示例

POST /api/runtime/login/autologin HTTP/1.1
Cookie: autologin=<加密票据>

响应

结构result(...) 自定义包装。成功时通过 Set-Cookie: accessToken=<jwt> 下发,并把账号记入登录缓存(标记 0)。

成功示例

{ "resultCode": "1", "msg": "自动登录", "url": "/static/signon/dispatcher.html" }

失败示例

{ "resultCode": "0", "msg": "不自动登录", "url": "" }


10. 获取微信配置

获取指定企业域的微信扫码登录配置。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/runtime/login/getwxconfig(完整:{signon-context}/api/runtime/login/getwxconfig
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
domainName query string 企业域名称(@RequestParam

请求示例

GET /api/runtime/login/getwxconfig?domainName=默认域 HTTP/1.1

响应

结构:原始 JSONObject(无外层包装),字段来自 Domain 实体。

成功示例

{ "agentId": "<企业微信应用 agentId>", "appId": "<企业微信 CorpId>", "callbackUrl": "<扫码回调 URL>" }


11. 获取钉钉配置

获取指定企业域的钉钉扫码登录配置。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/runtime/login/getddconfig(完整:{signon-context}/api/runtime/login/getddconfig
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
domainName query string 企业域名称(@RequestParam

请求示例

GET /api/runtime/login/getddconfig?domainName=默认域 HTTP/1.1

响应

结构:原始 JSONObject(无外层包装)。

成功示例

{ "appId": "<钉钉应用 AppId>", "callbackUrl": "<扫码回调 URL>" }


12. 微信扫码登录回调

处理微信扫码登录的回调请求,用授权码换取用户身份后签发 accessToken。

  • 接口类型:页面视图(@ResponseBody 返回 HTML/JS 字符串)
  • 请求方式GET
  • 请求路径/api/runtime/login/wxqrcodelogin(完整:{signon-context}/api/runtime/login/wxqrcodelogin
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
code query string 微信授权码(@RequestParam
state query string 状态参数,格式为 <contentPath>@<domainName>@RequestParam

请求示例

GET /api/runtime/login/wxqrcodelogin?code=<微信code>&state=%2Fportal%40默认域 HTTP/1.1

响应

结构:HTML/JS 字符串。成功时通过 Set-Cookie: accessToken=<jwt> 下发并跳转到分发页。

成功示例

Set-Cookie: accessToken=<jwt>; Path=/; HttpOnly
<script>window.location='/static/signon/dispatcher.html'</script>

失败时由 IOException 抛出,经全局异常解析器处理(无统一 Resource 体)。


13. 钉钉扫码登录回调

处理钉钉扫码登录的回调请求,用授权码换取用户身份后签发 accessToken。

  • 接口类型:页面视图(@ResponseBody 返回 HTML/JS 字符串)
  • 请求方式GET
  • 请求路径/api/runtime/login/ddqrcodelogin(完整:{signon-context}/api/runtime/login/ddqrcodelogin
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
code query string 钉钉授权码(@RequestParam
state query string 状态参数,格式为 <contentPath>@<appId>@RequestParam

请求示例

GET /api/runtime/login/ddqrcodelogin?code=<钉钉code>&state=%2Fportal%40dingxxxx HTTP/1.1

响应

结构:HTML/JS 字符串。成功时通过 Set-Cookie: accessToken=<jwt> 下发并跳转到分发页;任何异常或未匹配用户时返回字符串 error

成功示例

Set-Cookie: accessToken=<jwt>; Path=/; HttpOnly
<script>window.location='/static/signon/dispatcher.html'</script>

失败示例

error


14. 获取会话密钥

获取微信小程序会话密钥(jscode2session)。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/getsessionkey(完整:{signon-context}/api/runtime/login/getsessionkey
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
code query string 微信小程序 wx.login 返回的临时 code(@RequestParam

注:当前实现硬编码 appId=wx0430f353e725a806secret=7831a6cc7a304132f6bae24d32e64b47,未做配置化。

请求示例

POST /api/runtime/login/getsessionkey?code=<wx.login code> HTTP/1.1

响应

结构:原始 JSONObject(无外层包装),透传 WeixinUtil.getSessionKey(...) 返回值(含 session_keyopenid 等字段)。

成功示例

{ "session_key": "<会话密钥>", "openid": "<用户openid>", "errcode": 0, "errmsg": "" }


15. 获取域列表(旧) @Deprecated

获取系统中的企业域列表及登录页背景、密码加密模式等配置。已废弃,建议改用 16. 获取域列表

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/getDomainList(完整:{signon-context}/api/runtime/login/getDomainList
  • 鉴权:否
  • Tag:登录控制器

请求参数

无。

请求示例

POST /api/runtime/login/getDomainList HTTP/1.1

响应

结构result(...) 自定义包装。result 为对象,含:

字段 类型 说明
domainList string[] 企业域名称列表,元素形如 <域名>@<0\|1\|2\|3>(后缀 0=无扫码配置,1=仅微信,2=仅钉钉,3=两者皆有)
loginBackground string 登录页背景图路径(取自 sso.propertieslogin.background
encryptionMode int 密码加密模式(取自 passwordLegalao.login.password.encryption.mode,缺省 0)

成功示例

{
  "resultCode": "1",
  "msg": "成功",
  "result": {
    "domainList": ["默认域@0"],
    "loginBackground": "/uploads/login.png",
    "encryptionMode": 0
  }
}

失败示例

{ "resultCode": "0", "msg": "失败", "result": "<异常信息>" }


16. 获取域列表

获取系统中所有启用(status=1)的企业域。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/domains(完整:{signon-context}/api/domains
  • 鉴权:否
  • Tag:登录控制器

请求参数

无。

请求示例

GET /api/domains HTTP/1.1

响应

结构success/error 自定义包装(status/message/data),dataDomain 实体集合。注意错误时 status 仍为 0,错误信息走 messagedata

成功示例

{
  "status": 0,
  "message": "ok",
  "data": [
    { "id": "<域ID>", "name": "默认域", "status": 1, "...": "..." }
  ]
}

失败示例

{ "status": 0, "message": "error", "data": "<异常信息>" }


17. 获取多语言词列表

获取登录页面所需的多语言翻译,并把语言偏好写入 cookie。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/getMultiLangWordList(完整:{signon-context}/api/runtime/login/getMultiLangWordList
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
language body string 语言标识(如 zh_CNen),位于 @RequestBody JSONObjectlanguage 字段

请求示例

POST /api/runtime/login/getMultiLangWordList HTTP/1.1
Content-Type: application/json

{"language":"zh_CN"}

响应

结构result(...) 自定义包装。multiLangWordMap 含登录页所需词条(domainspageLoginAccountpageLoginPasswordpageLoginRememberLabelloginfrontPageLoginCopyrightmobilecodegetCodeloginway)。当 language 通过 SecurityURL.simpleSpecialSymbols 校验时,会同时下发 Set-Cookie: USERLANGUAGE=<language>

成功示例

{
  "resultCode": "1",
  "msg": "成功",
  "multiLangWordList": { "domains": "企业域", "login": "登录", "...": "..." }
}

失败示例

{ "resultCode": "0", "msg": "失败", "multiLangWordList": null }


18. 用户登录(第一步:账号校验)

校验账号密码与(必要时)验证码,签发 60 秒有效的中间令牌 checkInToken,返回该账号可登录的企业域列表。后续需调用 19. 用户登录 完成登录。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/checkin(完整:{signon-context}/api/runtime/login/checkin
  • 鉴权:否
  • Tag:登录控制器

请求参数

请求体@RequestBody JSONObject):

字段 类型 必填 说明
username string 账号名或手机号
password string 密码(前端做轻量混淆:末两位挪到前面再 BASE64 解码)
checkcode string 图形验证码;累计失败超 2 次后必填

请求示例

POST /api/runtime/login/checkin HTTP/1.1
Content-Type: application/json

{"username":"admin","password":"<混淆后密码>","checkcode":"ab12"}

响应

结构result(...) 自定义包装。返回的业务码与场景:

resultCode 场景 说明
1 登录成功 msg=「登录成功」,domains 为可选企业域列表;同时 Set-Cookie: checkInToken=<jwt>; Max-Age=60
0 账号锁定 / 失效 / 密码错误 / 验证码错误 / 用户不存在 msg 为对应多语言提示;当需要验证码时附带 checkcodeImg(base64 图片)
7 密码已过期 msg=「密码已过期」,附带 code(重置用临时 token)与 checkcodeImg

成功示例

HTTP/1.1 200 OK
Set-Cookie: checkInToken=<jwt>; Path=/; Max-Age=60

{ "resultCode": "1", "msg": "登录成功", "domains": [ { "id": "<域ID>", "name": "默认域", "status": 1 } ] }

失败示例(密码错误)

{ "resultCode": "0", "msg": "用户名或密码不正确", "returnUrl": "", "checkcodeImg": "data:image/jpg;base64,..." }

失败示例(账号锁定)

{ "resultCode": "0", "msg": "该账号已锁定", "returnUrl": "", "checkcodeImg": "data:image/jpg;base64,..." }

失败示例(密码过期)

{ "resultCode": "7", "msg": "密码已过期", "code": "<重置临时token>", "checkcodeImg": "data:image/jpg;base64,..." }

控制器从 passwordLegal 读取 ao.login.fail.maxtimes,超限时把账号 lockflag 置为 0(锁定)并提示锁定;登录成功后重置失败计数与验证码缓存(缓存后端为 Spring CacheManager,key 前缀 SIGNON_LOGIN_CACHE_KEY)。


19. 用户登录(第二步:选择域并签发 accessToken)

校验 checkInToken cookie 与所选企业域,签发 accessToken 并下发 cookie,返回登录后跳转 URL。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/signin(完整:{signon-context}/api/runtime/login/signin
  • 鉴权:否(依赖 checkInToken cookie,由 18. 用户登录 签发)
  • Tag:登录控制器

请求参数

请求体@RequestBody JSONObject):

字段 类型 必填 说明
userDomainName string 形如 <username>@@<domainName>
remember string 0=不记住,其他=记住登录(写入自动登录票据 cookie)
url string 登录前原始访问 URL,影响 returnUrl
path string 应用上下文路径,作为 url 缺省时计算 returnUrl 的依据

请求示例

POST /api/runtime/login/signin HTTP/1.1
Content-Type: application/json
Cookie: checkInToken=<jwt>

{"userDomainName":"admin@@默认域","remember":"1","url":null,"path":"portal"}

响应

结构result(...) 自定义包装。

resultCode 场景 说明
0 checkInToken cookie 缺失或与请求用户名不匹配 msg=「登录已失效,请重新登录」/「错误」
1 登录成功 / 代理登录页面 returnUrl 为登录后跳转地址(PC 为 /signon/dispatcher.html,移动端为 /mobile/index.html#/?accessToken=<jwt>,代理人为 /signon/agent.html?url=...&id=...),同时下发 accessTokenisFromLogin 两个 cookie

成功示例

HTTP/1.1 200 OK
Set-Cookie: accessToken=<jwt>; Path=/; HttpOnly
Set-Cookie: isFromLogin=1; Path=/

{ "resultCode": "1", "msg": "登录成功", "returnUrl": "/signon/dispatcher.html", "checkcodeImg": "", "accessToken": "<jwt>" }

失败示例

{ "resultCode": "0", "msg": "登录已失效,请重新登录" }


20. 获取用户所属企业域

基于 checkInToken cookie 返回该用户可登录的企业域(带 Logo)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/runtime/login/domains(完整:{signon-context}/api/runtime/login/domains
  • 鉴权:否(依赖 checkInToken cookie)
  • Tag:登录控制器

请求参数

无(从请求 cookie 中读取 checkInToken)。

请求示例

GET /api/runtime/login/domains HTTP/1.1
Cookie: checkInToken=<jwt>

响应

结构result(...) 自定义包装。domainsDomain 实体列表(仅 status=1,并对 logoUrl 做相对路径裁剪)。

成功示例

{
  "resultCode": "1",
  "msg": "成功!",
  "domains": [ { "id": "<域ID>", "name": "默认域", "logoUrl": "/uploads/logo.png" } ]
}

失败示例

{ "resultCode": "0", "msg": "登录已失效,请重新登录" }


21. 短信验证码发送

向指定手机号发送短信验证码并返回过期时间。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/runtime/login/smsauth(完整:{signon-context}/api/runtime/login/smsauth
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
telephone query string 手机号
domainName query string 企业域名称(控制器未强校验,仅声明)

注:源码中两参数均为裸 String(无 @RequestParam),按 Spring MVC 默认行为作为必填请求参数处理。

请求示例

GET /api/runtime/login/smsauth?telephone=13800000000&domainName=默认域 HTTP/1.1

响应

结构result(...) 自定义包装。校验码写入 session(smsCheckCode),短信通过云服务接口(Environment.getYunServiceCallUrl())下发。timeout 为过期时间(秒),取自 AuthConfig.SMS_TIMEOUT

成功示例

{ "resultCode": "1", "msg": "返回短信验证码过期时间", "returnUrl": "", "timeout": 300, "accessToken": "" }

失败示例

{ "resultCode": "0", "msg": "用户不存在请联系管理员进行添加", "returnUrl": "", "timeout": 0, "accessToken": "" }
{ "resultCode": "0", "msg": "发送短信验证码失败,请检查配置信息", "returnUrl": "", "timeout": 0, "accessToken": "" }


22. 短信验证码登录

使用短信验证码进行登录。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/loginSMS(完整:{signon-context}/api/runtime/login/loginSMS
  • 鉴权:否
  • Tag:登录控制器

请求参数

请求体@RequestBody JSONObject):

字段 类型 必填 说明
telephone string 手机号
smsCheckCode string 短信验证码(与 session 内 smsCheckCode 比对)
path string 应用上下文路径(缺省由 getWarContextPath("portal") 推断)

请求示例

POST /api/runtime/login/loginSMS HTTP/1.1
Content-Type: application/json

{"telephone":"13800000000","smsCheckCode":"12345","path":"portal"}

响应

结构result(...) 自定义包装。

  • 单域用户:直接签发 accessToken,Set-Cookie: accessToken=<jwt>returnUrl=/signon/dispatcher.html
  • 多域用户:返回中间跳转页 /signon/domain.html?...&checkInToken=<jwt>,由用户选域后再走 19. 用户登录
  • 验证码错误或用户不存在:resultCode=0

成功示例(单域)

HTTP/1.1 200 OK
Set-Cookie: accessToken=<jwt>; Path=/; HttpOnly

{ "resultCode": "1", "msg": "登录成功!", "returnUrl": "/signon/dispatcher.html", "checkcodeImg": "", "accessToken": "<jwt>" }

失败示例

{ "resultCode": "0", "msg": "手机验证码校验失败!", "returnUrl": "./smsAuth.html?telephone=13800000000&domainName=", "checkcodeImg": "", "accessToken": "" }


23. 用户注册

新用户注册(手机号 + 短信验证码 + 选域)。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/register(完整:{signon-context}/api/runtime/login/register
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
telephone query string 手机号(同时作为账号)
username query string 用户名
password query string 密码
smsCheckCode query string 短信验证码(与 session 内 smsCheckCode 比对)
domainName query string 企业域名称

注:以上均为裸 String(无 @RequestParam),按 Spring MVC 默认作为必填请求参数处理。是否开启注册由 SignonConfig 加载的 login.open.userregister 控制(须为 "true")。

请求示例

POST /api/runtime/login/register?telephone=13800000000&username=alice&password=secret&smsCheckCode=12345&domainName=默认域 HTTP/1.1

响应

结构result(...) 自定义包装。成功时由 runtime Feign(RuntimeFeignService.doregisterUser)落库并返回 token,通过 Set-Cookie: accessToken=<jwt>; Max-Age=7200Set-Cookie: isFromLogin=1 下发。

成功示例

HTTP/1.1 200 OK
Set-Cookie: accessToken=<jwt>; Path=/; Max-Age=7200
Set-Cookie: isFromLogin=1; Path=/

{ "resultCode": "1", "msg": "ok", "url": "/portal/vue/index.html#" }

失败示例

{ "resultCode": "0", "msg": "用户注册功能已关闭", "returnUrl": "", "timeout": 0, "accessToken": "" }
{ "resultCode": "0", "msg": "用户已存在,不可重复注册", "returnUrl": "", "timeout": 0, "accessToken": "" }


24. 找回密码

通过短信验证码找回密码(重置为默认密码 123456)。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/runtime/login/retrievePassword(完整:{signon-context}/api/runtime/login/retrievePassword
  • 鉴权:否
  • Tag:登录控制器

请求参数

参数名 位置 类型 必填 说明
telephone query string 手机号
smsCheckCode query string 短信验证码

注:以上均为裸 String(无 @RequestParam),按 Spring MVC 默认作为必填请求参数处理。是否开启找回密码由 login.open.retrievepassword 控制(须为 "true")。

请求示例

POST /api/runtime/login/retrievePassword?telephone=13800000000&smsCheckCode=12345 HTTP/1.1

响应

结构result(...) 自定义包装。重置由 runtime Feign(RuntimeFeignService.retrievePassword)完成,新密码固定为 123456,msg 拼接默认密码。

成功示例

{ "resultCode": "1", "msg": "<成功提示>123456" }

失败示例

{ "resultCode": "0", "msg": "找回密码功能已关闭", "returnUrl": "", "timeout": 0, "accessToken": "" }
{ "resultCode": "0", "msg": "验证码错误", "returnUrl": "", "timeout": 0, "accessToken": "" }


25. 刷新 accessToken

凭当前请求内携带的 accessToken 换取新的 accessToken。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/api/refreshAccessToken(完整:{signon-context}/api/refreshAccessToken
  • 鉴权:否(控制器内调用 Security.getUserIdFromToken(request) 解析当前 token,失败时返回的 userId 可能为 null,进而由 Security.generateToken 处理)
  • Tag:登录控制器

请求参数

无显式参数;从请求中按 Security.getUserIdFromToken 顺序(query accessToken → query access_token → 请求头 accessToken → Cookie accessTokenAuthorization: Bearer)解析当前用户 ID。

请求示例

GET /api/refreshAccessToken?accessToken=<旧jwt> HTTP/1.1

响应

结构result(...) 自定义包装。

成功示例

{ "resultCode": "0", "msg": "ok", "accessToken": "<新jwt>" }