OIDC
1. 创建配置文件
创建
sso.json
默认路径为/data/hap/script/volume/sso/sso.json
,内容如下:
注意:如果挂载后依然出现 404 ,可将内容复制到 json.cn 中验证json格式是否合法
{
"mode": "common-oidc",
"name": "oidc",
"oidc": {
"oidcUrl": "",
"clientId": "",
"clientSecret": "",
"redirectUrl": "",
"responseTypes": "code",
"scope": "openid email",
"params": {
"UserId": "sub",
"Name": "name",
"Email": "email",
"Mobile": "phone_number"
},
"autoRegister": true,
"projectId": ""
}
}
部分参数及解释
参数 | 类型 | 是否必须 | 含义 |
---|---|---|---|
oidc.oidcUrl | String | 是 | 配置oidc服务发现地址;可设置返回格式如下: 配置参数示例 |
oidc.clientId | String | 是 | 分发给应用的客户端Id |
oidc.clientSecret | String | 是 | 分发给应用的客户端密钥 |
oidc.redirectUrl | String | 是 | 回调地址;设置为 {server}/orgsso/oidc-redirect |
oidc.responseTypes | String | 是 | 支持授权码模式;配置为 code |
oidc.scope | String | 否 | 获取用户信息范围;可填写为openid,email,profile...任意组合;比如设置为 openid email ; 默认为 openid |
oidc.params | Object | 是 | 返回用户信息字段映射规则,key为固定字段value根据实际用户信息配置;参数配置方法 |
oidc.params.UserId | String | 是 | 用户唯一标识 |
oidc.params.Name | String | 否 | 姓名,用户已存在会覆盖 |
oidc.params.Email | String | 否 | 邮箱;通过邮箱查找或者注册此字段必须设置; 邮箱或者手机号必须设置其中一个;如已经绑定第三方关系的,可通过关系查找用户,邮箱或手机可不设置 |
oidc.params.Mobile | String | 否 | 手机号;通过手机号查找或者注册此字段必须设置; |
oidc.params.Positions | Array | 否 | 职位;自动更新用户的职位,不存在自动创建 |
oidc.params.Departments | Array | 否 | 部门;自动更新用户的部门,不存在自动创建 |
autoRegister | Boolean | 否 | 当账号不存在时,是否自动创建账号;默认为 true |
projectId | String | 是 | HAP 组织编号;组织管理(右上角) > 组织信息(页)>组织编号ID;(多组织单点登录不需要配置此参数,见步骤3) ;如 1x-2x-3x-4x-5x |
交互示意图
获取访问令牌(access_token)的接口需要满足以下要求:
-
支持 POST 方式调用(请求参数通过 URL 传递)
-
需要先获得服务端 authorizePath 授权
-
返回值为 JSON 格式,且需满足如下格式:
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ..."
}
获取用户信息的接口需要满足以下要求:
-
支持 GET 方式调用(参考 userInfoUrl 参数说明)
-
需要先获得服务端 authorizePath 授权
-
返回值为 JSON 格式,且需满足如下格式:
{
"sub": "248289761001",
"name": "Jane Doe",
"email": "janedoe@example.com",
"phone_number": "123"
}
根据以上👆返回,则 params 的配置为:
"params": {
"UserId": "sub",
"Name": "name",
"Email": "email",
"Mobile": "phone_number"
}
{
"issuer": "https://oidc-demo.domain.com/oidc",
"authorization_endpoint": "https://oidc-demo.domain.com/oidc/auth",
"token_endpoint": "https://oidc-demo.domain.com/oidc/token",
"claims_parameter_supported": false,
"claims_supported": [
"sub",
"username"
],
"code_challenge_methods_supported": [
"plain",
"S256"
],
"end_session_endpoint": "https://oidc-demo.domain.com/oidc/session/end",
"grant_types_supported": [
"authorization_code",
"password",
"refresh_token"
],
"response_types_supported": [
"code"
],
"scopes_supported": [
"openid",
"offline_access",
"username",
"phone",
"email",
"address",
"profile"
],
"userinfo_endpoint": "https://oidc-demo.domain.com/oidc/me",
......
}
2. 挂载配置文件
修改微服务应用对应的
docker-compose.yaml
,默认路径/data/hap/script/docker-compose.yaml
, 在volumes
中增加文件挂载并重启微服务应用。
- ./volume/sso/sso.json:/usr/local/MDPrivateDeployment/sso/OptionFile/sso.json
开启关系查找
如需要绑定第三方关联ID,则需要创建文件
extend.json
默认路径/data/hap/script/volume/sso/extend.json
内容如下
{
"relation": true
}
增加挂载文件
- ./volume/sso/extend.json:/usr/local/MDPrivateDeployment/sso/extend.json
挂载配置完成需重启微服务应用
重启成功后可通过GET方式访问 {server}/orgsso/checkssoconfig
接口,查看配置文件是否挂载成功
3. 单点登录
单组织
浏览器访问: {server}/orgsso/oidc?returnUrl={returnUrl}
多组织
浏览器访问: {server}/orgsso/oidc?returnUrl={returnUrl}&appKey={appKey}&sign={sign}×tamp={timestamp}&projectId={projectId}
对于多组织 projectId
需要通过参数传递,还需要企业授权认证参数;
企业认证授权签名算法请参考:https://www.showdoc.com.cn/mingdao/15539798
{server}
为 HAP 系统地址,比如可替换为:http://192.168.10.20:8880
{returnUrl}
为登录成功后的跳转地址,可不填写;比如需要跳转应用页面,则可替换为:http://192.168.10.20:8880/app/cf595091-e3ac-4669-a320-068e55533c33/64477b37df36209b5f36f1cf/64477b4f61655012a90ed994?from=insite
如果访问过程中出现的 SSO Error 提示,则可以通过管理员账号登录 HAP 系统,点击右上角头像: 系统配置>日志;搜索服务名为 sso
,排查具体报错原因