OpenID Connect 的配置存储在 > 的 openId 部分中。
| OpenID Connect 配置仅在 Codebeamer 启动时读取一次。对“应用程序配置”进行的修改只有在重新启动后才会生效。 |
| 要创建和修改 OpenID 配置,可通过 > 页面,或使用应用程序配置的 JSON。为了获得最佳结果,请仅使用一种方法来避免潜在的冲突和意外行为。 |
另请参阅
用于测试 OpenID 设置的 Docker Compose,了解如何通过 OpenID Connect 配置 Docker 容器。
OAuth/OpenID Connect 提供者可以有专属的服务器配置,以及用于 OpenID Connect 身份验证和 OAuth2 访问令牌自省的不同
客户端配置。
例如:
"openId": {
"server": {
"issuer": "http://my.oidc.provider"
},
"authentication": {
"clientId": "cbAuth",
"clientName": "cbAuth@test-pc",
"clientSecret": "AIJ0OWXu ...",
"tokenEndpointAuthMethod": "client_secret_basic",
"scope": "openid, profile, email, phone, address, offline_access",
"userName": "preferred_username"
},
"introspection": {
"clientId": "cbIntro",
"clientName": "cbIntro@test-pc",
"clientSecret": "wEDO8i3Q ...",
"tokenEndpointAuthMethod": "client_secret_basic"
},
"reuseDefaultAccount": true,
"forceOAuth": false,
"cacheSuccessTTL": "10min",
"cacheFailureTTL": "15min",
"validatorCacheTTL": "60min",
"symmetricKeyValidatorCacheTTL": "24hours",
"audienceWhitelist": "a,b"
}
如果 OAuth/OpenID Connect 提供者不需要提供不同的客户端进行 OpenID Connect 身份验证和 OAuth2 访问令牌自省,无需额外的自省配置:将使用身份验证配置进行自省。
在这种情况下,还可以使用客户端作为身份验证的别名。
还可以配置 OpenID Connect 提供者特定
用户信息到
Codebeamer user 帐户属性的映射,例如
"openId": {
"server": {
...
},
"client": {
...
},
"user": {
"name": "preferred_username",
"firstName": "given_name",
"lastName": "family_name",
"email": "email",
"phone": "phone_number",
"mobile": "mobile_number",
"language": "locale",
"timeZonePattern": "zoneinfo"
},
...
}
server 部分包含有关
OpenID Connect 提供者 (例如
Google) 的信息。如果 OpenID Connect 提供者支持
服务器配置发现,只需提供
服务器颁发者 URI,例如
"server": {
"issuer": "https://accounts.google.com"
}
否则,必须手动提供所有必要服务器端点的信息,例如:
"server": {
"issuer": "https://accounts.google.com",
"authorizationEndpointUri": "https://accounts.google.com/o/oauth2/v2/auth",
"tokenEndpointUri": "https://oauth2.googleapis.com/token",
"jwksUri": "https://www.googleapis.com/oauth2/v3/certs",
"userInfoUri": "https://openidconnect.googleapis.com/v1/userinfo",
"introspectionEndpointUri": "https://www.googleapis.com/oauth2/v3/tokeninfo",
"revocationEndpointUri": "https://oauth2.googleapis.com/revoke",
"endSessionEndpoint": "https://accounts.google.com/logout"
}
请知悉:虽然
Google 支持
服务器配置发现,但返回的
服务器配置不包含
"endSessionEndpoint"。因此,需要进行静态配置。
如果 OAuth/OpenID Connect 提供者不需要针对 authentication 和 introspection 提供不同的
client 配置,无需额外的
introspection 配置:将使用
authentication (或
client) 配置进行自省:
• clientId 是在客户端注册期间分配给此 Codebeamer 实例的唯一 ID。
• clientName 是在客户端注册期间分配给此 Codebeamer 实例的可选名称。
• tokenEndpointAuthMethod 定义针对服务器 (令牌和/或自省) 端点进行
客户端身份验证的方法。请知悉,应使用标准方法:
◦ "none" (无需客户端身份验证)
◦ "client_secret_basic" (如果未指定,此为默认值)
◦ "client_secret_post"
◦ "client_secret_jwt"
◦ "private_key_jwt" (仅适用于 Codebeamer 9.5 及更新版本)
• clientSecret 是在客户端注册期间分配给此 Codebeamer 实例的密码;只有在 tokenEndpointAuthMethod 为 "client_secret_{basic|post|jwt}" 时,才需要此项。在 clientSecret 字段中输入的字符始终处于隐藏状态。只有在设置新的客户端密码时,才能查看输入的字符。
• privateKey 是客户端 (专用)
JSON Web 密钥,仅在
tokenEndpointAuthMethod 为
"private_key_jwt" 时才是必需项,例如:
"privateKey": {
"kid": "ABC123DEFG",
"kty": "EC",
"crv": "P-256",
"x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
"y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
"d": "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE",
"use": "sig"
}
-----BEGIN EC PRIVATE KEY-----
BLMHcCAQRstEEINCC5ntCkm4N6+/8fhj64hjljlkjajetkvdCfkloqafjkqGSM49
JKLHoUQDQ32tukgA9jlklaafdgE5srK3Sgdfhk83jf/gDZnuPwkUm0FJ
23sfhjb0TYKLFbJgghk30nL5P5AiwFoGERdjl3jk9u==
-----END EC PRIVATE KEY-----
"privateKey" : {
"kid" : "ABC123DEFG",
"pem" : [ "-----BEGIN EC PRIVATE KEY-----",
"MHcCAQEEINCC5ntCkm4N6+/7n2iDiU25nxXBNH86CJqRpxAHcbZPoAoGCCqGSM49",
"AwEHoUQDQgAEskm1lUS3bdp8lXXZtFXeyxJHeUDLx6rK3Sgjre/gDZnuPwkUm0FJ",
"5b0XS6qbhLFbJytOGH5g8U5AiwFoSQqRgw==",
"-----END EC PRIVATE KEY-----" ]
}
其中,"pem" 是 -----BEGIN PRIVATE KEY----- 到 -----END PRIVATE KEY----- (包含二者) 之间采用字符串数组形式的行。
• scope 是所请求
范围的逗号分隔列表,且仅在
client/
authentication 配置中为必需项:
◦ openid (必填)
◦ profile (必填)
◦ email (必填)
◦ phone (选填但建议填写,但前提是受提供者支持)
◦ address (选填但建议填写,但前提是受提供者支持)
◦ 根据 OpenID Connect 提供者的不同,还可以配置其他范围。请查阅提供者的文档。
• userName 定义哪个
userinfo 声明 (按降序) 用作经过身份验证的用户的用户名。只有在没有
user 信息配置 (请参阅下文) 时,以及只有在
client/
authentication 配置中时才是必需项,除非只有
introspection 配置。
高级 client/authentication 设置 (可选):
• codeChallengeMethod:
◦ "S256"
◦ "plain"
• tokenEndpointAuthSigningAlg (只有在 tokenEndpointAuthMethod 为 "client_secret_jwt" 或 "private_key_jwt" 时):目前仅支持使用 SHA-2 散列算法的 HMAC:
◦ "HS256"
◦ "HS384"
◦ "HS512"
• idTokenSignedResponseAlg 是从令牌端点返回的 ID 令牌的必需签名。
要接受任何有效且受支持的签名,保留此项未定义。
• authOptions 是
身份验证请求中要传递到授权端点的附加参数,例如:
authOptions : {
"acr_values" : "special1 special2"
}
• tokenOptions 是
令牌请求中要传递到令牌端点的附加参数,例如:
tokenOptions : {
"myOption" : "myValue"
}
"tokenAuthJWTClaims" : {
"iss" : "<Apple Team ID>",
"aud" : "https://appleid.apple.com"
}
◦ "iss" 是要进行身份验证的客户端的 ID,但可以进行改写。例如,要
使用 Apple 登录,
"iss" 必须是从 Apple 开发人员帐户获取的 10 字符团队 ID。
◦ "sub" 必须是要进行身份验证的客户端的 ID,且无法改写。
◦ "aud" 应为授权服务器的令牌端点的 URL,但可以进行改写。例如,要
使用 Apple 登录,
"aud" 必须为
"https://appleid.apple.com" ◦ "exp" 默认为 60s,但可以进行改写。例如,"exp" : "20min" 或 "exp" : "2:30h"。但 "exp" 不能小于 "10s" 或大于 4380h (6 个月)
将从 OpenID Connect 提供者的
用户信息端点返回的关于最终用户的声明集通过
client/
authentication 配置进行定义 (请参阅上文):
"scope" : "openid, profile, email, phone, address"
• 或者 (仅限 Codebeamer 9.5 及更新版本):通过
authOptions 明确请求的附加
userinfo 声明 (请参阅上文),例如:
"authOptions" : {
"claims" : {
"userinfo" : {
"department_number": null,
"http://example.info/claims/groups": null
}
}
}
只能通过
claims 参数在
标准集外部请求声明。同时只能通过该参数请求无法通过
scope 值指定的
标准声明特定组合。
实际受支持。
只有在
OpenID Connect提供者未返回标准 OpenID Connect
userinfo 声明 (例如 Microsoft
ADFS) 或者您需要映射
其他声明时,才需要可选的
user 部分。
如果未指定
Codebeamer 帐户属性映射的提供者特定
user 声明,将应用以下默认/标准映射:
"user": {
"name": "sub",
"title": null,
"firstName": "given_name",
"lastName": "family_name",
"company": null,
"industry": null,
"address": "address.street_address",
"zip": "address.postal_code",
"city": "address.locality",
"state": "address.region",
"country": "address.country",
"language": "locale",
"timeZonePattern": "zoneinfo",
"email": "email",
"phone": "phone_number",
"mobile": null,
"skills": "profile",
"sourceOfInterest": null,
"divisionSize": null,
"teamSize": null
}
即使没有指定完整的自定义 user 映射,仍可通过 client/authentication 配置中的 userName 设置改写默认 username := "sub" 映射,例如 "userName" : "preferred_username"。
user 信息映射的左侧 (目标) 是 Codebeamer 帐户 (UserDto) 属性名称,这些名称是固定的。
但只需指定实际要映射的属性。至少 name 和 email 为必填项,其他所有均为选填项。
user 信息映射的右侧 (值) 是要映射到此
Codebeamer 用户属性的
声明的逗号分隔列表。如果指定多个声明,属性值将为实际存在的第一个声明的值,例如:
"user" : {
"name" : "preferred_username, name",
...
}
会将 name 声明的值分配给 Codebeamer 用户名,前提是不存在 preferred_username 声明。优先顺序从左到右。
要映射
聚合声明 (例如
address),请使用点运算符,例如:
"user" : {
...
"address" : "address.street_address",
"zip" : "address.postal_code",
"city" : "address.locality",
"state" : "address.region",
"country" : "address.country",
...
}
user 属性的值 null 会将此属性标记为不映射。省略该属性结果也一样。
属性名称 divisionSize 和 "teamSize" 有点误导性,因为它们不是数值,而是字符串。因此,实际上可以向这些字段分配部门名称/id 或组织单位名称/id,例如:
"user" : {
...
"divisionSize" : "department_number",
"teamSize" : "http://example.info/claims/groups",
...
}
请知悉,Codebeamer 用户帐户没有 nickname、middle_name、gender 和 birthdate 属性。
当前也不支持 picture 映射。
请知悉,Microsoft
Active
Directory
Federation
Services (
ADFS) 默认
不会返回标准 OpenID Connect
userinfo 声明!
而是得到如下所示的结果:
实际响应取决于
ADFS 配置,并且通常包含的声明数量多于上例。
我们建议
重新配置 ADFS 以返回标准 OpenID Connect
声明,但如果不可行,就需要自定义
ADFS 声明到
Codebeamer user 映射。
例如:
"openId": {
"server": {
"issuer": "https://my-adfs.cloudapp.azure.com/adfs"
},
"client": {
...
},
"user": {
"name": "unique_name",
"email": "upn",
...
},
...
}
直接 openID 设置:
• reuseDefaultAccount 如果此项设置为 true,默认/初始系统管理员帐户 ("bond") 将复用于通过 OpenID Connect 登录的第一个用户,从而将此用户设置为默认系统管理员。默认值为 false。
• cacheSuccessTTL 需要缓存成功 OAuth2 访问令牌自省的时间,例如 1:30h、20min 或 90s。默认值为 10min。
• cacheFailureTTL 需要缓存失败 OAuth2 访问令牌自省的时间。默认值为 15min。
可以设置受众白名单。
• audienceWhitelist 受众名称的逗号分隔列表
可以设置证书到期时间。
• validatorCacheTTL JWT 密钥的到期时间,例如 1:30h、20min 或 90s。默认值为 60min。
• symmetricKeyValidatorCacheTTL 基于客户端密码的客户端对称加密验证器缓存的到期时间,例如 1:30h、20min 或 90s。默认值为 24h。
必须设置 redirectUri:
"openId" : {
"authentication" : {
...
"redirectUri" : https://<domain>/(cb)/login/oauth/authenticate.spr
...
}
}
可配置多个 OAuth/OpenID Connect 提供者,每个提供者都具有专用服务器配置和不同
客户端配置:
• OpenID Connect authentication。
• OAuth2 访问令牌 introspection。
例如:
"openId": {
"issuers": [
{
"server": {
"issuer": "http://my.oidc.provider"
},
"authentication": {
"clientId": "cbAuth",
"clientName": "cbAuth@test-pc",
"clientSecret": "AIJ0OWXu ...",
"tokenEndpointAuthMethod": "client_secret_basic",
"scope": "openid, profile, email, phone, address, offline_access",
"userName": "preferred_username"
},
"introspection": {
"clientId": "cbIntro",
"clientName": "cbIntro@test-pc",
"clientSecret": "wEDO8i3Q ...",
"tokenEndpointAuthMethod": "client_secret_basic"
}
},
{
"server": {
"issuer": "https://accounts.google.com",
"authorizationEndpointUri": "https://accounts.google.com/o/oauth2/v2/auth",
"tokenEndpointUri": "https://oauth2.googleapis.com/token",
"jwksUri": "https://www.googleapis.com/oauth2/v3/certs",
"userInfoUri": "https://openidconnect.googleapis.com/v1/userinfo",
"introspectionEndpointUri": "https://www.googleapis.com/oauth2/v3/tokeninfo",
"revocationEndpointUri": "https://oauth2.googleapis.com/revoke",
"endSessionEndpoint": "https://accounts.google.com/logout"
},
"client": {
"clientId": "26576725-kdf73jgfgu7653flfhe7t53.apps.googleusercontent.com",
"clientName": "Your codebeamer Instance",
"clientSecret": "lkfjdu736ei7hJF#3",
"tokenEndpointAuthMethod": "client_secret_basic",
"scope": "openid, profile, email",
"userName": "preferred_username"
}
}
],
"issuerDiscovery": "webFinger",
...
}
• 将仅对第一个已配置颁发者进行身份验证。
• 只能处理来自其他
颁发者的 OAuth2 访问令牌,前提是这些令牌为
iss 声明引用已注册颁发者的
JSON Web 令牌 (JWT)。
• issuerDiscovery 可以为以下任一项:
◦ 通过 my-applicationContext.xml 部署的自定义 bean 的名称,例如实例
◦ Java 类的完全限定名 (在 Codebeamer 服务器类路径中)
▪ 类必须具有无参构造函数或具有类型为 com.intland.codebeamer.security.openIdConnect.service.IssuerConfigurationService 的单一参数的构造函数。
▪ 类可以具有 @Autowired 特性。
bean 或类必须:
• 实现 com.intland.codebeamer.security.openIdConnect.service.IssuerDiscoveryService
• 扩展 com.intland.codebeamer.security.openIdConnect.service.impl.DefaultIssuerDiscoveryService