OpenID Connect (OAuth2)
基于 OpenID Connect (OAuth2) 的单点登录 
Codebeamer 还支持通过 MITREid Connect 进行单点登录,这是由 MIT Internet Trust Consortium 采用 Java 语言在 Spring 平台上构建的认证 OpenID Connect 参考实施。
OpenID Connect 是一个建立在 OAuth2 协议之上的简单身份层,允许 Codebeamer 根据授权服务器执行的身份验证来验证最终用户的身份,以及获取最终用户的基本个人资料信息。
通过环境变量 (默认值 = false) 启用 OpenID。
CB_openId_enabled=true
配置自动 OpenID 登录。
true:通过 OpenID 自动登录。
false:显示 Codebeamer 登录页面。您可以选择以 Codebeamer 用户身份进行登录,或使用 SSO 进行登录。
环境变量:
CB_openId_automatic=true
应用程序 JSON:
"openId": {
"automatic": true
}
Web GUI 交互式身份验证 
通过 Web 浏览器 (用户代理) 以交互方式访问 Codebeamer Web GUI 时,CodebeamerOpenID Connect 授权码流中充当客户端应用程序资源服务器用户信息。身份验证和授权 GUI 仅由授权服务器提供。请参阅下面的 GoogleMITREid Connect 示例。Codebeamer 登录页面未使用,并且 Codebeamer 不知道已经过身份验证的用户的登录凭据。如果尚未为已经过身份验证的用户创建帐户,系统会使用授权服务器所提供的用户信息和以下项的默认设置创建新帐户:
用户许可证
用户组成员资格
用户帐户匹配通过以下 userinfo 值 profile 声明的第一个非空值完成:
preferred_username
nickname
name
将移除所生成 Codebeamer 用户帐户名称中的所有空格。
用户帐户匹配配置方式如下:
环境变量:
CB_openId_client_resolveUserBy="email, username"
应用程序 JSON
"openId": {
"client": {
"resolveUserBy": "email, username"
}
}
可用选项:emailssoIdusername
默认值:ssoIdusernameemail
用户帐户匹配通过已配置的 userinfo 值 profile 声明的第一个非空值完成。
Codebeamer 中进行交互式用户退出登录时:
撤销Codebeamer 用户会话关联的 OAuth2 访问令牌
将用户重定向到授权服务器结束会话端点
如果授权服务器提供前端渠道注销,注销授权服务器时也会从 Codebeamer 中间接注销该用户。
示例 1:使用 Google 登录 
使用 Google 授权服务器时,将应用标准的 Google Web 单点登录,必须先在其中输入您的用户名/电子邮件,然后再输入密码:
<客户端名称> 将是 Codebeamer 实例的名称。单击第二个界面上的 Next 时,将显示 Codebeamer,可在其中使用 Google 帐户登录。从 Codebeamer 注销时,用户将重定向到 Google 的注销页面:
示例 2:使用 MITREid Connect 登录 
使用 MITREid Connect 授权服务器时,这些界面完全不同:如果尚未登录 (单点登录),必须自行进行身份验证:
如果您尚未授权当前客户端 (Codebeamer 实例),系统会要求您进行授权,您也可以拒绝
<客户端名称> 将是 Codebeamer 实例的名称。在单击 Authorize 之前,可以选择
限制客户端对个人信息的访问权限,例如隐藏您的地址。
同时定义此授权的有效期。
Codebeamer 注销时,用户将重定向到 OpenID Connect 服务器的注销页面:
基于 OAuth2 的 REST API 身份验证 
如果第三方客户端应用程序想要访问受 OpenID Connect 保护的 Codebeamer 实例 (例如,通过 REST API (v1)),Codebeamer 仅充当资源服务器客户端应用程序负责从相应的授权服务器获取 OAuth2 访问令牌,并将其随每个请求传递给 Codebeamer
OpenID 在将 Codebeamer 实例配置为通过 OpenID Connect/OAuth2 对用户进行身份验证之前,您必须在所选 OpenID 提供者 (OP) 中将该 Codebeamer 实例注册为客户端
OpenID 提供者 
可以选择公开的 OpenID 提供者,例如:
Google
Yahoo
Okta
* 
配置 Google 或 Okta,但不能同时配置两者。
或者,可以设置专属的 (认证) 企业 OpenID Connect 提供者,例如:
其他
一个 Codebeamer 实例只能有一个 OpenID 提供者。
OpenID 客户端注册 
客户端注册过程取决于所选的 OpenID 提供者,但通常一定要提供:
客户端名称和 (可选) 说明
有关客户端应用程序的信息:
名称,例如 codebeamer
类型 (CodebeamerPublicWeb 应用程序)
徽标,例如 https://codebeamer.com/cb/images/newskin/header/cblogo-xl.png
主页,例如 https://intland.com/application-lifecycle-management/
隐私政策链接,例如 https://intland.com/privacy-policy/
服务条款链接 (可选)
一个或多个联系人 (电子邮件地址)
客户端所需的范围
openid (必填)
profile (必填)
email (必填)
phone (选填,但建议填写)
address (选填,但建议填写)
offline_access (选填,但前提是受提供者支持)
根据 OpenID Connect 提供者的不同,还可以配置其他范围。请查阅提供者的文档。
客户端登录重定向 URI (对于授权代码流 的第 4 步,为必填项,请参阅上图)。这必须是 Codebeamer 实例的绝对登录 URL,例如 http[s]://<hostname>[:<port>][/cb/]/login.spr
客户端前端通道注销 URL (选填,并非所有授权服务器/OpenID 提供者都支持前端通道注销)
这必须是 Codebeamer 实例的绝对注销 URL,例如 http[s]://<hostname>[:<port>][/cb/]/logout.spr
是否允许客户端访问令牌自省端点Codebeamer 在充当资源服务器时需要自省!
在成功注册后,客户端还必须具有:
客户端 ID
客户端密码私钥
OpenID Connect 配置 
OpenID Connect 的配置存储在“系统管理” > “应用程序配置”openId 部分中。
* 
OpenID Connect 配置仅在 Codebeamer 启动时读取一次。对“应用程序配置”进行的修改只有在重新启动后才会生效。
* 
要创建和修改 OpenID 配置,可通过“系统管理” > “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"
}
密钥必须具有 "kid"。例如,要使用 Apple 登录,此项必须是从开发人员帐户获取的 10 字符密钥标识符。密钥 "use" 为可选项,但如果指定,必须为 "sig"
如果必须自行创建公钥/私钥对,可以使用此 JSON Web Key Generator
如果密钥对在客户端注册时由 OpenID 提供者创建,并且私钥仅作为 .pem.p8 编码文件提供,例如,在创建并下载私钥使用 Apple 登录时:
-----BEGIN EC PRIVATE KEY-----
BLMHcCAQRstEEINCC5ntCkm4N6+/8fhj64hjljlkjajetkvdCfkloqafjkqGSM49
JKLHoUQDQ32tukgA9jlklaafdgE5srK3Sgdfhk83jf/gDZnuPwkUm0FJ
23sfhjb0TYKLFbJgghk30nL5P5AiwFoGERdjl3jk9u==
-----END EC PRIVATE KEY-----
可以将 .pem.p8 编码文件转换为 JSON Web 密钥,例如通过 pem-to-jwk。不过也可以直接使用 PEM 编码密钥,例如:
"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 (选填但建议填写,但前提是受提供者支持)
offline_access (选填,但前提是受提供者支持)
根据 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:用于 private_key_jwt 有效载荷的可选声明,例如:
"tokenAuthJWTClaims" : {
"iss" : "<Apple Team ID>",
"aud" : "https://appleid.apple.com"
}
默认使用 private_key_jwt 的标准声明:
"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,例如:
"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 值指定的标准声明特定组合。
请查阅提供者的 /.well-known/openid-configuration,了解哪些
scopes
claims
实际受支持。
只有在 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) 属性名称,这些名称是固定的。
但只需指定实际要映射的属性。至少 nameemail 为必填项,其他所有均为选填项。
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 用户帐户没有 nicknamemiddle_namegenderbirthdate 属性。
当前也不支持 picture 映射。
请知悉,Microsoft Active Directory Federation Services (ADFS) 默认不会返回标准 OpenID Connect userinfo 声明!
而是得到如下所示的结果:
{
"iss": "https://my-adfs.cloudapp.azure.com/adfs",
"aud": "https://my-codebeamer.host",
"sub": "248289761001",
"upn": "[email protected]",
"unique_name": "Jane.Doe",
"sid": "S-1-5-21-72543-3645445-326572-242",
...
}
实际响应取决于 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 设置:
forceOAuth 如果此项设置为 true,要访问 REST API (v1),需要 OAuth2 访问令牌。默认值为 false,这表示还允许使用基本摘要式身份验证,但仅适用于设有密码的 (技术) 用户帐户。
reuseDefaultAccount 如果此项设置为 true,默认/初始系统管理员帐户 ("bond") 将复用于通过 OpenID Connect 登录的第一个用户,从而将此用户设置为默认系统管理员。默认值为 false
cacheSuccessTTL 需要缓存成功 OAuth2 访问令牌自省的时间,例如 1:30h20min90s。默认值为 10min
cacheFailureTTL 需要缓存失败 OAuth2 访问令牌自省的时间。默认值为 15min
可以设置受众白名单。
audienceWhitelist 受众名称的逗号分隔列表
可以设置证书到期时间。
validatorCacheTTL JWT 密钥的到期时间,例如 1:30h20min90s。默认值为 60min
symmetricKeyValidatorCacheTTL 基于客户端密码的客户端对称加密验证器缓存的到期时间,例如 1:30h20min90s。默认值为 24h
必须设置 redirectUri
"openId" : {
"authentication" : {
...
"redirectUri" : https://<domain>/(cb)/login/oauth/authenticate.spr
...
}
}
DPT 特定键 
以下键为特定于 DPT 的键;对 DPT 使用 OAuth 配置时,需要使用这些键:
requestTokenUri
authType
introspectUserResolveAttribute
refreshTokenScope
userResolveResource
此外,OSLC 配置中指定的 oAuthConfigId 必须与 openId OAuth 配置下于此处指定的颁发者密钥值相匹配。
例如:
"oslc": {
"enabled": true,
"oAuthConfigId": "https://<hostname:port>",
.
.
.
}
多个 OAuth2/OpenID Connect 提供者 
可配置多个 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 或类必须:
实现 IssuerService
实现 com.intland.codebeamer.security.openIdConnect.service.IssuerDiscoveryService
扩展 com.intland.codebeamer.security.openIdConnect.service.impl.DefaultIssuerDiscoveryService
机器对机器 (M2M) 身份验证 
Codebeamer 支持机器对机器类型的身份验证。
* 
M2M 令牌不能始终用于从 OpenID 服务器中检索用户信息。
先决条件 
1. 可用于授权的 Codebeamer 用户。
2. 必须通过为 "openId" 应用程序配置添加以下其中一个代码段,激活 Codebeamer 中的 M2M 身份验证:
基于 "username" 的配置:
"openId": {
"client": "...",
"server": "...",
"m2m": {
"username": "myApiUser"
}
}
* 
应用配置 "username" 后,API 调用将使用相关用户进行授权。必须将此用户添加到具有“REST / 远程 API - 访问”权限的用户组。
基于 "usernameAttribute" 的配置:
"openId": {
"client": "...",
"server": "...",
"m2m": {
"usernameAttribute": "aud"
}
}
* 
通过 "usernameAttribute" 配置,Codebeamer 会根据定义的属性名称从令牌收集用户名。如果是数组类型声明,Codebeamer 会使用第一个元素。
API 调用流
不使用 M2M 配置 
1. 使用 Authorization: Bearer <Token> 标头来启动 API 调用。
2. 通过令牌找到颁发者配置。
3. 验证令牌。
4. 调用 UserInfo 端点并处理响应。
5. 根据用户信息查找用户,并通过该用户进行授权。
具有 username 的 M2M 配置 
1. 使用 Authorization: Bearer 标头来启动 API 调用。
2. 通过令牌找到颁发者配置。
3. 验证令牌。
4. 系统根据 "username" 从 M2M 配置中查找用户。
5. 通过用户进行授权。
具有 usernameAttribute 的 M2M 配置 
1. 使用 Authorization: Bearer 标头来启动 API 调用。
2. 通过令牌找到颁发者配置。
3. 验证令牌。
4. 用户名的检索依据 "usernameAttribute"
5. 然后根据用户名查找用户。
6. 通过用户进行授权。
接上文 
在 OAuth2/OpenID Connect 身份验证生效后:
只有从用户的 Web 浏览器访问 OpenID Connect 提供者 (授权服务器) 时,才能以交互方式登录 Codebeamer
无法回退到内部 Codebeamer 登录,因为根据 OpenID Connect 用户信息创建的用户帐户没有密码。
这对您有帮助吗?