分享
查看: 589|回复: 0

[分享] ThingJS-X单点登录功能实现

[复制链接]

ThingJS-X单点登录功能实现

发表于 2023-8-28 10:21:37 来自 分享 阅读模式 倒序浏览
zzv_icon589 zzr_icon0 查看全部
本帖最后由 zhaojinguo 于 2023-8-28 10:31 编辑


单点登录基于 OAuth2 实现,如果不太了解其流程,可以看下:oauth2.0授权码模式详解
并且把相关接口都调试一下,跑通流程。
修改配置文件
进入 ThingJS-X安装目录\ThingJSX\thingjsx-server\conf 中,打开 application-system.properties 文件。
1. 开启 OAuth2
  1. web.sso.loginType=oauth2
复制代码

2. 配置客户端 id 和秘钥
id 和秘钥是在提供单点登录的 OAuth2 平台上申请的。

  1. # client_id
  2. security.oauth2.client.client-id=640124dde18b42dd82d77a3b0e88f84b
  3. # client_secret
  4. security.oauth2.client.client-secret= 123456
复制代码


3. 配置 OAuth2 的接口地址
这些接口地址必须配置正确,否则会导致登录流程失败
  1. # 服务器的基础地址
  2. security.oauth2.server.base-uri = https://xx.xxx.com

  3. ## 获取code 值的接口地址
  4. security.oauth2.client.user-authorization-uri=${security.oauth2.server.base-uri}/api/auth/oauth/authorize

  5. ## 根据 code 值换取 token 的接口地址
  6. security.oauth2.client.access-token-uri=${security.oauth2.server.base-uri}/api/auth/oauth/token

  7. ## 根据 token 换取用户信息的接口地址
  8. security.oauth2.resource.user-info-uri=${security.oauth2.server.base-uri}/api/auth/users/current
复制代码


4. 配置 ThingJS-X 的回调接口 URL
  1. # // {访问ThingJS-X的真实地址}:{PORT}/thing/getTokenByCode
  2. security.oauth2.server.token_callback.url = http://10.205.2.126:1662/thing/getTokenByCode
复制代码

测试流程
修改完配置文件后,如果单点登录相关的接口都是按照规范来设计的,例如请求参数与返回数据都是与 ThingJS-X 一一对应,那么就没有问题了。
获取 code
这时可以直接访问 ThingJS-X 系统,最终转换的地址大概是这样:
ThingJS-X单点登录功能实现
这一步是去获取 code。
回调
当 code 获取成功时,OAuth 平台方会通过响应头的 Location 进行请求转发,从而调用我们上面第 4 步配置的接口 URL。
在 ThingJS-X 后台日志里,可以看到这么一段:
ThingJS-X单点登录功能实现
表明回调成功。
获取 token
然后 ThingJS-X 就会调用接口获取 token 了,如果成功了,后台日志大概是这样:
ThingJS-X单点登录功能实现获取用户信息
如果 token 也获取成功,那么 ThingJS-X 就会调用接口获取用户信息了,成功后,后台日志会打印用户信息:
ThingJS-X单点登录功能实现
登录
获取完用户信息后,就会进行登录啦,拿接口返回的用户信息去匹配 ThingJS-X 的用户信息了。
ThingJS-X 对于获取用户信息接口返回的数据有一定的要求,详情请看 https://wiki.uino.com/external/blog/6305dcfa274f046188b46966.html 中的“OAuth服务器接口规范”内容。

假设用户信息接口返回的数据如下:
{  id: xxx,  name: '用户名',  age: 18,  // 其它信息...}

这里需要注意了,ThingJS-X 中有这么一个配置:
  1. # oauth2服务器返回的用户信息中和ThingJS-X系统中用户的loginCode对应的字段Key,默认为loginCode
  2. security.oauth2.server.loginCodeKey=loginCode
复制代码

默认是会从响应的数据对象中取 loginCode 字段来进行用户名匹配,我上面假设的数据中,用户名字段是 name,那么就需要修改下这个配置啦:
  1. security.oauth2.server.loginCodeKey = name
复制代码
ThingJS-X 是拿系统用户列表中的登录名和上面接口的用户名进行匹配的,匹配成功后,就进入到后台管理系统页面啦。
ThingJS-X单点登录功能实现
注意事项版本问题
因 ThingJS-X 版本原因,可能需要做下相关配置,详情请看“版本升级配置”内容。
单点登录可选配置
OAuth2 平台方提供的接口,可能有些特殊要求,例如某些请求接口要配置请求头信息、使用 Bearer 授权类型等等,这时你需要在配置文件中再进行配置一下,详情请看“可选配置”内容。
报错排查
通过 project-d.log 的日志发现用户信息已经获取到了,但是却报如下错误:
ThingJS-X单点登录功能实现
解决方法:打开配置文件 application-pro.properties,在最下面添加如下配置。
  1. server.max-http-header-size=65546
复制代码

avatar
游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

130700ppkpl8x3t7tt1b1t