对接说明
OIDC
[认证授权] OIDC(OpenId Connect)
- OIDC是OpenID Connect的简称。它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。
- 参考资料:
- http://openid.net/connect/
- http://openid.net/connect/faq/
- http://openid.net/developers/certified/
- JWT : https://tools.ietf.org/html/rfc7519
- https://jwt.io
认证过程:
-
基于Authorization Code的认证请求 详见: Authorization Endpoint
-
获取ID Token
使用上一步获得的code来请求Token EndPoint,这一步同OAuth2,详见: Token Endpoint
Token EndPoint会返回响应的Token,其中除了OAuth2规定的部分数据外,还会附加一个id_token的字段(见 ID Token)。例如(解密见:https://jwt.io ):
{ "access_token": "7d7ffdf1dd626ddc042f96b29ba8bf64", "refresh_token": "9844af4a27870037fbe9dd6c34407d1e", "scope": "4", "id_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ6cmpZSUFzSE5mN3VuZkVGbVN0aCIsImlzcyI6Imh0dHA6Ly93LnVucG93ZXIub3JnL3NzbyIsInN1YiI6IkEyZDRqWFk2ZEZ0eGF3c2JzQWN5IiwiZXhwIjoxNTM1NDc1MTg2LCJpYXQiOjE1MzU0NzUwNjYsIm5vbmNlIjoiYzhiZDkzYWQtMzkzMC00ZWNlLWE0ZjQtNzNiYWM0ZmM4YmFhIiwibmFtZSI6IkFsaWNlIiwiYWNjb3VudCI6IkFsaWNlIiwidGVuYW50IjoiODQyOTZhMWUtNmEzNS0xMWU4LWJlYjEtODRhNmM4NGFlMjQ2IiwiaWQiOiI4NDNkODE0NC02YTM1LTExZTgtYmViMS04NGE2Yzg0YWUyNDYifQ.jJmv6oLmB8-y18hy2xT5IcdFWTAytD20jIX3JEU38pA",
"token_type": "Bearer", "expires_in": 2000000 }
ID Token
- ID Token是一个安全令牌,包含用户信息(由一组Cliams构成以及其他辅助的Cliams)的JWT格式的数据结构。
- sub (Subject Identifier)
- 租户内的唯一id,一般称为openid,不会为空
- 以下两种情况例外,会返回第三方提供的账号:
- 本地数据库虽然有账号,但通过配置项
IGNORE_ACCOUNT_NOT_FOUND
配置了"不验证本地账号" - 本地数据库无账号
- 本地数据库虽然有账号,但通过配置项
- 科探扩展字段说明:
字段名 | 类型 | 含义 |
---|---|---|
account | string | 推荐优先使用的用户id,用于openid不统一的情况。可为空,为空时请使用sub |
tenant | string | 用户所属的租户的标识,格式上一般是域名(但不保障) |
- 一个ID Token的样例:
{
"aud": "WqrO6vGnAKfgbfYtNNNr",
"iss": "https://server.example.com/sso/oauth2",
"jti": "80da7179c66dcc324cf8523175e8a8b8",
"sub": "wQWhfqaPPlDWDSnOLTwf",
"exp": 1702879445,
"iat": 1702879325,
"sid": "5f38e1419c3313b9a27d0405c0ec2c54",
"principal": "USER_CODE",
"tenant": "example.com",
"external":false,
"openId": "wQWhfqaPPlDWDSnOLTwf",
"loginName": "Alice",
"name": "张三",
"userType": "ITAdmin",
"userName": "Alice",
"account": "Alice",
"email": "alice@example.com.cn",
"userCode": "Alice",
"deptCode": "Dept"
}