跳转至

用户资料与授权范围

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。