本指南旨在帮助管理员解决下游业务系统(作为服务提供者 SP)通过飞连(作为身份提供者 IdP)进行 OIDC 集成时遇到的各类异常场景(如:登录跳转失败、认证报错、登录后无法获取用户信息等)。借助本文中的排查方法,管理员可快速定位问题并解决两端配置不一致等核心问题。
名称 | 说明 |
|---|---|
Client ID | 飞连为每个接入应用分配的唯一标识,用于标识调用方的身份。在飞连管理后台的 SSO 配置页面获取。 |
Client Secret | 飞连为每个接入应用生成的密钥,用于调用 Token 接口时的身份校验。请妥善保管,切勿泄露或硬编码在前端代码中。 |
回调地址 (Redirect URI) | 授权成功后,飞连将用户重定向回业务系统的地址。必须与飞连管理后台配置的回调地址完全一致。 |
Authorization Code | 飞连返回的一次性授权码,用于后续交换 Access Token。有效期很短,且只能使用一次。 |
Access Token | 访问令牌,用于业务系统调用飞连的用户信息接口(UserInfo)时携带的身份凭证。默认有效期 2 小时。 |
ID Token | JWT 格式的身份凭证,包含用户的基本信息(如 |
Refresh Token | 用于在 Access Token 过期后获取新的 Access Token。有效期 10 天。 |
IdP (Identity Provider) | 身份提供商,在本文讨论环境中即飞连。负责验证用户身份并签发 Token。 |
SP (Service Provider) | 服务提供商,即下游业务系统。接收并校验飞连发送的 Token,允许用户进入。 |
在与企业进行用户 SSO 集成时,飞连作为身份提供者(IdP),企业自有的业务系统则作为服务提供者(SP)。通过 IdP 颁发的 ID Token,下游应用提供者能够确定自身用户与飞连用户的对应关系,从而实现免密访问。
标准登录交互过程如下:
多数单点登录失败问题由基础配置不一致引起,请优先排查以下配置:
redirect_uri,必须与飞连管理后台配置的回调地址完全一致(包括协议、域名、路径及参数)。/api/oidc/authorize)”和“获取 Token 接口(/api/oidc/token)”时,两者传递的 redirect_uri 参数也必须保持完全一致。refresh_token 获取了新的 access_token,那么之前获取的旧 access_token 会立即过期失效,无法继续使用。id_token 为固定生成的 JWT 格式,内部包含的信息(Claim)不可自定义。如需获取用户的额外字段信息,业务系统需通过 access_token 调用 UserInfo 接口获取。如果基础配置检查无误,建议通过手动模拟请求的方式,验证飞连侧的 OIDC 接口功能是否正常。
https://{飞连门户域名}:{飞连门户端口}/api/oidc/authorize?client_id={飞连管理后台获取的client_id}&redirect_uri={管理后台配置的回调地址}&response_type=code&scope=openid
提示:请替换上述 URL 中的
{飞连门户域名}、{飞连门户端口}、{client_id}及{回调地址}为实际目标值。
使用 Code 换取 Token
获取到 Code 后,请使用以下 cURL 命令(或使用 Postman 等工具)换取 Token。
注意:Code 是一次性的,且有效期较短,请尽快完成此步。
curl --location 'https://{飞连门户域名}:{飞连门户端口}/api/oidc/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id={飞连管理后台获取的client_id}' \ --data-urlencode 'client_secret={飞连管理后台获取的client_secret}' \ --data-urlencode 'code={步骤1中获取的code}' \ --data-urlencode 'redirect_uri={管理后台配置的回调地址}' \ --data-urlencode 'grant_type=authorization_code'
期望的返回结果示例:
{ "access_token": "<Access_Token字符串>", "refresh_token": "<Refresh_Token字符串>", "token_type": "bearer", "id_token": "<ID_Token字符串>", "expires_in": 7200 }
使用 Access Token 换取用户信息
使用上一步获取的 access_token,调用 UserInfo 接口验证能否成功获取用户信息:
curl -k 'https://{飞连门户域名}:{飞连门户端口}/api/oidc/userinfo/normal?access_token={上一步获取的access_token}'
排障结论:
若通过以上步骤仍无法准确定位问题,请收集以下材料联系技术支持协助排查:
.har 文件。/opt/corplink/log/portal.*.logportal.*.log。ID Token 解码后包含以下关键声明(Claim):
声明 | 说明 |
|---|---|
| 签发者,应为飞连的 OIDC Provider 地址 |
| 用户的唯一标识符 |
| 接收方(一般为业务方的 Client ID) |
| 过期时间,Token 在此时间后失效 |
| 签发时间 |
| 用户邮箱 / 手机号 |
| 用户姓名 |
| 用户的飞连工号 / ID |
用户未登录或需要判断用户是否登录时,让用户浏览器重定向到此地址。
/api/oidc/authorize参数 | 类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
client_id * | string | 必填 | 应用唯一标识 | 在【应用管理 - 应用列表】的应用详情中获取。 |
redirect_uri * | string | 必填 | 回调地址 | 在【应用管理 - 应用列表】的应用详情的「回调地址」中配置。 |
response_type * | string | 必填 | 认证类型 | 内容固定为“code”。 |
scope * | string | 必填 | 访问权限 | 必填,内容必须包含“openid”,其余字段当前不解析。 |
state | string | 选填 | 标志字段 | 选填,跟随回调请求返回。 |
login_source | string | 选填 | 指定登录源方式 | Beta版本,不要使用 |
使用 Code 换取 Token,请求必须是 x-www-form-urlencoded 表单形式。
/api/oidc/token参数 | 类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
client_id * | string | 必填 | 应用唯一标识 | 在【应用管理 - 应用列表】的应用详情中获取。 |
client_secret * | string | 必填 | 应用密钥 | 在【应用管理 - 应用列表】的应用详情中获取。 |
grant_type * | string | 必填 | 授权类型 | 内容固定为“authorization_code”或“refresh_token”。 |
code * | string | 选择性必填 | 授权码 | 当 grant_type 为“authorization_code”时必填,认证接口返回的 code 授权码。 |
refresh_token * | string | 选择性必填 | 刷新凭证 | 当 grant_type 为“refresh_token”时必填,之前获取 token 时的凭证。 |
redirect_uri * | string | 必填 | 回调地址 | 需要和「认证登录接口」中的 |
常见错误码(Failure Code):
错误码 | 错误类型 | 错误描述 |
|---|---|---|
400 |
| 参数错误 / 无效的授权范围 |
401 |
| 应用认证失败 / 授权码无效 |
401 |
| 不支持的授权模式 |
403 |
| 用户无权限访问当前应用 |
500 / 503 |
| 服务器内部错误 / 服务暂不可用 |
使用 Access Token 获取对应用户的详细信息。
/api/oidc/userinfo/normal参数 | 类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
Authorization * | string | 二选一必填 | 用户Token | 和 access_token 二选一,置于前期头中,格式为“Bearer YourToken”。 |
access_token * | string | 二选一必填 | 用户Token | 和 Authorization 二选一,置于url参数中,格式为“YourToken”。 |
发起 OIDC 登出请求,清理当前浏览器的 OIDC 登录态。必须由浏览器发起,不支持服务间调用。
/api/oidc/logout参数 | 类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
id_token_hint | string | 选填 | 身份令牌 | 飞连颁发的身份验证令牌,id_token,为空默认只登出当前飞连用户 |
post_logout_redirect_uri | string | 选填 | 用户 Token | 登出后重定向地址,在【应用管理 - 应用列表】的应用详情的「回调地址」中配置,需要 urlencode,不填默认为第一个回调地址。 |
ui_locales | string | 选填 | 首选语言 | |
state | string | 选填 | 标识字段 | 回调到 post_logout_redirect_uri 参数 |
用户登出时,飞连会主动向配置了登出 URL 的已登录应用发送单点登出请求(Back-Channel Logout)。应用收到后需执行注销流程并返回 200 状态码。
POST /backchannel_logout HTTP/1.1 Host: rp.example.org Content-Type: application/x-www-form-urlencoded logout_token=eyJhbGci ... .eyJpc3Mi ... .T3BlbklE ...
其中 logout_token 解码后的 JSON 结构如下,业务系统需校验其中的 sub 等字段以确认登出用户:
{ "iss": "https://corplink.com", "sub": "1", "aud": "LzcRGdpLxwhzGXQFbufPZZKFXkcwfXhnicuFhFmf", "iat": 1644204668, "jti": "ID.c05266e3369d4dee9ae01a629c4c7595", "nbf": 1644204668, "events": { "http://schemas.openid.net/event/backchannel-logout": {} } }