在授权框架上增加身份语义

OAuth可让应用获得受限资源访问,但单凭访问令牌,并不定义怎样向应用证明终端用户的认证结果。OpenID Connect把提供认证的一方称为OpenID Provider,把使用其结果的客户端称为Relying Party,并用标准声明表达这种身份信息。

其授权码流程先返回授权码,再在令牌端点取得包含ID Token的响应;客户端验证该令牌后取得用户的主体标识。访问令牌则可用于UserInfo等资源访问,不能因为两者都叫token就把它们当作可互换的凭证。

参考:[1]

主体标识需要发行者范围

ID Token包含发行者iss、主体sub、受众aud、到期exp和签发时间iat等必需声明。sub在发行者内局部唯一且不重新分配,不应把不同发行者恰好相同的字符串直接视为同一个用户;姓名或邮箱展示值也不是这种绑定的替代品。

依赖方须精确核对预期发行者与自身client_id等受众,并处理适用的密码学和时间验证。若请求携带nonce,返回ID Token必须带回并匹配它;可读出JSON字段,只说明数据能解析,不表示这些检查已经通过。

参考:[1]

资料响应必须与已认证主体对应

客户端可以携访问令牌向UserInfo端点请求资料;提供者出于隐私等原因,可以省略部分被请求的声明。请求了某个资料范围,并不保证响应必定含有姓名、邮箱等所有展示字段。

UserInfo必须提供sub,客户端还必须核对它与ID Token的sub完全一致;不一致时不得使用该资料响应。这防止把另一个令牌取得的个人资料,误拼到当前已认证用户身上,说明身份联邦仍需要逐项绑定,而不是收到一个资料对象便直接登录。

参考:[1]