用户资料与授权范围¶
UserInfo 提供本次授权允许读取的当前资料。使用 ID token 验证登录,再读取 UserInfo;两者的 sub 必须完全一致。
当前字段¶
| Scope | 当前已实现字段 | 说明 |
|---|---|---|
openid |
sub |
必需,OIDC 用户标识;应用用 (iss, sub) 识别账号 |
profile |
nickname |
可能不返回,可更改,不唯一,不是 Unix 用户名或真实姓名 |
email |
email、email_verified |
当前主邮箱及其验证状态;需说明用途并取得用户授权,不是公开资料 |
sai.profile |
institution_name、research_area、profile_revision |
单独批准后提供;前两项是用户自述,版本用于资料变更判断,不代表认证等级 |
sai.profile.details |
bio、website、location |
个人简介、个人主页和所在地,均为选填;需单独批准并取得用户同意,仅由 UserInfo 提供 |
sai.assurance |
实名认证、科研认证、机构邮箱认证和活动资格的当前状态 | 需单独申请,并由用户同意;仅由 UserInfo 提供,不包含认证材料 |
未填写或未授权的字段可能不返回。不要用用户名、邮箱或内部 ID 填充缺失昵称,也不要把缺少 email_verified 当作验证通过。当前 email scope 的邮箱及验证状态也会进入 ID token 和 access token;昵称仅由 UserInfo 提供。读取当前资料时使用 UserInfo,不把令牌中的快照作为长期资料来源。
当前暂不提供 preferred_username/public_handle、picture、locale、zoneinfo、updated_at 等完整 profile 字段。
请求示例¶
将访问令牌放在 Authorization 头中,不能放入 URL:
GET /realms/sai/protocol/openid-connect/userinfo HTTP/1.1
Host: id.open-sai.com
Authorization: Bearer ACCESS_TOKEN
Accept: application/json
以下是合成示例,实际字段取决于授权和用户资料:
{
"sub": "opaque-example-subject",
"nickname": "科研用户",
"email": "researcher@example.org",
"email_verified": true
}
获批 sai.profile 后可能追加:
{
"institution_name": "Example Research Institute",
"research_area": "材料科学",
"profile_revision": 7
}
获批 sai.profile.details 并由用户同意后,可额外读取:
{
"bio": "研究材料与计算方法\nOpen science",
"website": "https://researcher.example.org/",
"location": "北京"
}
简介是最多 1000 个 Unicode 字符的纯文本,可包含换行;主页是最多 2048 个字符的 HTTP(S) 网址,不含用户名和密码;所在地是最多 255 个字符的自填文字。应用应按纯文本呈现,不执行 HTML,也不从所在地推断用户位置或身份。SAI 不抓取个人主页内容。
这些字段不属于既有 profile 或 sai.profile 授权。登记新范围不会给已有应用或旧令牌增加权限,刷新旧授权也不会自动取得它们。
这是同一个 UserInfo 对象中的字段,后一个片段不是独立接口响应。profile_revision 只描述共享资料,不是权限版本或认证状态。
认证状态¶
应用获准使用 sai.assurance 并取得用户同意后,UserInfo 可返回以下对象:
{
"sai.assurance": {
"schema_version": 1,
"researcher_current": true,
"government_identity_current": false,
"institutional_email_current": true,
"event_eligibility_current": false,
"assurance_revision": 7,
"evaluated_at": "2026-01-01T00:00:00Z",
"next_evaluation_at": null
}
}
| 字段 | 含义 |
|---|---|
researcher_current |
当前满足 SAI 的科研用户认证条件 |
government_identity_current |
当前实名认证有效 |
institutional_email_current |
当前机构邮箱认证有效 |
event_eligibility_current |
当前活动资格有效 |
assurance_revision |
认证结果版本;相关记录或结果变化时递增 |
evaluated_at |
本次检查时间,使用 UTC |
next_evaluation_at |
已知的下一次可能变化时间;没有预定变化时为 null |
机构邮箱认证或活动资格有效时,科研用户认证也有效;反过来不一定成立。主邮箱的 email_verified 仅表示该邮箱已验证,不等于机构邮箱认证。应用不应根据邮箱域名、单位名称或用户填写的文字推断认证结果。
这些字段只说明认证状态,不提供真实姓名、证件、邮箱域名、ORCID 标识、活动名称或审核材料,也不授予应用内的角色、发帖权限或计算权限。应用自行决定业务规则。
请求未获得该权限,或用户没有可供共享的认证记录时,整个 sai.assurance 对象可能不返回。缺少该对象不代表认证失败;应用可以继续提供无需认证资格的功能。已授权的认证数据暂时无法读取时,UserInfo 返回 503 temporarily_unavailable,不要把它当成“未认证”,也不要用旧的通过记录授予新权限。
需要依据认证状态决定操作权限时,重新读取 UserInfo,并核对 sub、schema_version、时间及版本。按接入时约定的有效期限使用结果,不能把一次通过保存为永久资格。拒绝未知版本和格式错误的对象。
账号关联¶
应用应对 (issuer, subject) 设置精确、区分大小写的唯一约束。第三方客户端使用登记的 pairwise subject 配置;不同应用 sector 不应据 sub 进行跨应用追踪或关联。同一 sector 的客户端可能收到相同的 sub,sector 的变更必须经过迁移评审。
用户更改昵称或邮箱不改变账号归属。相同邮箱不证明两个本地账号属于同一个人;已有账号绑定须由用户证明对两边账号的控制权并明确确认。
资料使用与撤回¶
资料按已获批目的使用,应用可以进一步隐藏,不能扩大披露范围。主邮箱不能直接作为公开主页字段。政府身份、证件、机构认证证据、手机号、其他联系方式、Unix UID/GID、组织权限、钱包或账务不属于此接口。
scope 变化或应用授权被撤销后,停止使用失去授权的资料,并按你的隐私和保留规则处理已保存的资料。新的 UserInfo 成功响应应替换对应的允许字段;不要让已撤回字段永远留在缓存中。
SAI 账号页是共享资料和登录安全的管理入口。应用可引导用户前往 SAI 账号,不要采集 SAI 密码或实现第二个共享资料写入来源。需要返回应用的账号管理入口应在接入时登记,不能接受任意返回 URL。