OIDC协议单点登录开发文档
# OIDC协议单点登录开发文档
# 一、 OIDC协议授权码模式交互流程
步骤说明:
- 用户通过浏览器访问资源应用。
- 应用判断当前未登录重定向至SSO,发起Oidc授权发起接口(/authorize接口)。
- 浏览器收到请求后,转发Oidc授权Request给SSO。
- 用户在SSO推送的登录页面中输入用户名和密码,SSO对用户提供的身份信息进行验证,并构建授权code的响应,重定向至资源应用的回调地址。
- 浏览器响应后转发Oidc授权code给资源应用。
- 资源应用内部使用授权code调用SSO颁发token接口。
- SSO返回token给资源应用。
- 资源应用内部使用token调用SSO用户信息接口。
- SSO返回用户信息给资源应用。
# 二、 认证接口
# 1. 获取公钥
# 1.1 接口描述
获取公钥串,用于IDToken的校验;
# 1.2 请求路径
/api/sso/protocol/oidc/jwks
# 1.3 HTTP请求方法
GET
# 1.4 请求参数
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
# 1.5 返回字段
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
kty | String | RSA | 密钥使用的加密算法 |
kid | String | 用于匹配密钥,主要在JWK集合中选择jwk | |
use | String | sig | 公钥的使用目的 |
alg | String | 标识密钥的算法 | |
n | String | 公钥的模值 | |
e | String | 公钥的指数 |
# 1.6 接口示例
调用参数:/api/sso/protocol/oidc/jwks
成功返回:
{
"keys": [
{
"kty": "RSA",
"kid": "6919612419616771",
"use": "sig",
"alg": "RS256",
"n": "q8wpJW3_JyvGDp3yaEvMt_Al1tknoGFAXdj4R6tBMNUzBC1q9-a91_YEdnPxLZ-1IoN9EAe9vwGz4JF6wvdQZxPgHg6Iwczbzjvh65WG_ltf7BkwJWtwpDir5nLKLzQaEqyETbCtltiVBM3SmbiX-cMgVJyOch5xYdeTN2qVY-HIC6VZEfpq6GVslMhK2Br-8KDZ582vAnhwcJg68QVNQZe-8Pw-MXNYYWlf2EC93CyQ7-V8jyXuNcaQbulL0V5_bXBmi7sfFWlQbqOSQsGZJSKVNHWBJ_QFFMMCxiNkcXJSVqaBJ8v-GgICi8eSw6H1muYG5t_1FXkNgNyP97OPSQ",
"e": "AQAB"
}
]
}
2
3
4
5
6
7
8
9
10
11
12
**失败返回:**无
# 2. 请求授权
# 2.1 接口描述
发起认证授权请求
# 2.2 请求路径
/api/sso/protocol/oidc/authorize
# 2.3 HTTP请求方法
GET
# 2.4 请求参数
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
client_id | String | IDP分配给应用的客户端ID | |
response_type | 返回值类型,授权码模式为code,隐含模式为token | ||
redirect_uri | 应用回调地址 |
# 2.5 返回字段
302重定向
# 2.6 接口示例
调用参数:/api/sso/protocol/oidc/authorize
成功返回:
//302重定向
http://app/demo/callback?code=OC-160-GoFhTmaYT2nfffHq6LtDPwnPFf5O4YBYPCb
2
失败返回
The client_id error.
# 3. 获取Token
# 3.1 接口描述
获取ID Token
# 3.2 请求路径
api/sso/protocol/oidc/token
# 3.3 HTTP请求方法
POST
# 3.4 请求参数
- 授权码模式:
grant_type=authorization_code&client_id=xxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxx&code=OC-1-xxxxxxxxxxxxxxx&redirect_uri=http://
[www.demo.com/callback](http://www.demo.com/callback)
2
- password模式:
grant_type=password&username=zhangsan&password=123456&client_id=xxxxxxxxxx
- 刷新Token模式:
grant_type=refresh_token&client_id=xxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxx&refresh_token=RT-10-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 客户端模式:
grant_type=client_credentials&client_id=xxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxx
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
grant_type | String | 授权类型(authorization_code,client_credentials,refresh_token,password) | |
client_id | String | 客户端ID | |
client_secret | String | 客户端密钥 | |
code | String | 授权code | |
redirect_uri | String | 回调地址 | |
username | String | 用户名 | |
password | String | 密码 | |
refresh_token | String | 刷新Token |
# 3.5 返回字段
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
access_token | String | ||
token_type | String | ||
expires_in | number | ||
refresh_token | String | 刷新Token,需要Idaas配置应用时开启 |
# 3.6 接口示例
调用参数:/api/sso/protocol/oidc/token
成功返回:
{
"access_token": "AT-499-zKcb2TbfKiwdxnkkg17dO9LTT6u0OdcMPZQ",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "RT-499-kHMbfoRsm2fXfGx3wVD5zmNa4MrB5TzXoQ5",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjY5MTk2MTI0MTk2MTY3NzEifQ.eyJqdGkiOiI0M2IyZGZhYS01NTFjLTRjMDQtYjc5OS1lMGM1ZGE5YjIxMDUiLCJpc3MiOiJodHRwczovL2lkYWFzLXRlc3QtMDEuc3NvMzYwLmNuL2FwaS9zc28iLCJhdWQiOiJVemRKNzJzek5xOU5MczEwODgxYlB5NWdtTjI1MTdKelUzMDEiLCJleHAiOjE2NjMwMzg2MTgsImlhdCI6MTY2MzAzNTAxOCwibmJmIjoxNjYzMDM0NzE4LCJzdWIiOiJ0YW5nbCIsImF1dGhUeXBlIjoiUFdEIiwic2NoZW1hIjoiQVVUSE9SSVpBVElPTl9DT0RFIiwib3NrIjoiMGU5YTE5YmEzODI0ZDJjZmRmMjRiMTc1NDIwNWYzMGMiLCJzdGF0ZSI6bnVsbCwibm9uY2UiOm51bGwsImF0X2hhc2giOiJ2d1NkOTloeWFFWlh2aGRFT3VPN1Z3PT0iLCJ1aWQiOiI2OTMyNzYzNzU2MjAyNzAzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoidGFuZ2wifQ.ccoDAmuAktMffqi7JH-AArsxxJvn97KgIDY8kAL90XZm_50yUQjlF_d01I27NhNUTQYjyL3MOAvbGHE5KnopwX3vFnOrVr1h_wwBb4yyPmHdbGXFTHq15Qq_bR0XgF3FRG7x2Ig7IYoKtcbLNiv99VG3gSaaMZvBsLHWswEsaRGD4UV0tQk8jZu_ih8KSak9ogVvXI2Bsres1j1ssbpd5HCuX0THOgbMt_LUeDG21C5wRfQGF5SBrqV5Wn_0rcFdiLXnrX4b7au_Ei0Wl14o8faqcu-PPq6jT8P-os7VFj7BH7pAiD40xHvM2cQZGI9IF4r2EfpCdgqDrRc-WueFJw"
}
2
3
4
5
6
7
失败返回:
- 授权码模式:
error=invalid_grant
- password模式:
{
"code": "IDS0161002",
"msg": "账号或密码错误,还剩3次机会,登录失败5次后账号将锁定30分钟"
}
2
3
4
- 刷新Token模式:
error=invalid_grant
- 客户端模式:
{
"timestamp": 1662636170951,
"status": 401,
"error": "Unauthorized",
"message": "",
"path": "/protocol/oidc/accessToken"
}
2
3
4
5
6
7
# 4. 获取用户信息
# 4.1 接口描述
获取用户信息
# 4.2 请求路径
api/sso/protocol/oidc/profile
# 4.3 HTTP请求方法
GET
# 4.4 请求参数
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
access_token | String | 获取token接口返回的access token |
# 4.5 返回字段
参数 | 参数类型 | 参数值 | 参数描述 |
---|---|---|---|
sub | String | 用户名 | |
username | String | 用户名(可在认证属性中配置其他属性) | |
auth_time | number | 认证时间 |
# 4.6 接口示例
调用参数:/api/sso/protocol/oidc/profile
成功返回:
{
"sub": "sysadmin",
"username": "sysadmin",
"auth_time": 1663035777
}
2
3
4
5
失败返回:
{
"error": [
"expired_accessToken"
]
}
2
3
4
5
# 三、应用配置演示
# 1. IDaaS平台应用配置
管理员账号登录IDaaS,进入【后台管理】-->【应用管理】-->【新增应用】-->【创建并添加应用】
【应用属性】标签的【应用地址】填写应用的地址,打开【启用】的开关,如果该应用需要二次认证,可以勾选【登陆应用二次认证】,点击【确认】,保存配置
【协议配置】标签,【认证模式】选择【OIDC】,此时会自动生成基本信息,可以根据需求做出调整。client_id,client_secret会在步骤二中使用
【登录回调地址】需要跟应用平台确认,【登出回调地址】如果应用平台有对应的功能,可以配置,否则,可以随意配置
【认证属性】需要根据应用平台的要求做出选择,常用属性为【用户名】、【邮箱】、【手机号】,勾选需要的属性。属性名可以做映射,即应用属性名可以修改为应用平台的属性名,例如用户名在IDaaS的属性名为username,在应用平台为userName,那么可以在用户名对应的应用属性名一栏填入userName,完成映射。点击【确定】,保存配置
# 2. 应用平台配置
此步与应用平台息息相关,需要参考应用平台的配置说明。配置方法大相径庭,但主要目的一致:
配置client_id、client_secret
配置授权(authorize)、认证(token)、用户信息(profile)端点
# 3. 分配应用权限
【用户服务管理】-->【用户管理】,找到需要分配应用的用户,【查看详情】
【应用信息】标签,【添加应用】
勾选刚刚配置的应用,【确定】
# 4. 单点登录
登录分配了应用权限的账号,点击应用
跳转成功