同意请求的 OpenID Connect 请求映射
OAuth 和 Open ID Connect 授权流程可能会向用户提供请求授权的许可提示。
- 共享用户概要文件中的数据,例如,电子邮件地址。 可以选择用指示共享数据的目的的信息来补充此请求。
- 代表用户执行操作,例如,在寒冷天气启动用户的车辆并加热或发起付款。
scope 参数的形式请求操作。 但是,有时可能需要修改请求。 例如,- 请始终检查用户授权状态,以遵守用户许可协议。
- 根据用户的认证会话来过滤掉特定
scope值。 - 添加更多上下文以指示请求数据的原因,无论是在
scope中进行编码(例如,email_for_billing),还是作为另一个请求参数(例如,authorization_details)的一部分提供。
此类型的修改可以通过使用同意请求参数的定制规则来实现。 参见属性函数。 可以使用简单的单行表达式语言或更高级的基于 YAML 的多行文档来编写规则。 请参阅多行规则执行程序。
可用的输入对象
因为此定制规则在认证之后但在授权之前运行,所以可用信息不包括所有可能的域对象。 它们被限制为以下类型。
- HTTP 请求上下文
- 用户登录 Verify 时,可以在请求/映射规则中访问入局 HTTP 请求上下文。 所有 OAuth 请求参数(例如,
claims和scope)在此requestContext中可用。 的总体结构和用法在属性函数的" HTTP 请求requestContext上下文"部分中有详细说明。为了简化访问,在requestContext中预先计算了某些值。claims请求参数以JSON格式表示,如下例所示。{ "id_token": { "claim_name": { "essential": false, "value": "some_value" } }, "userinfo": { "claim_name": { "essential": false, "value": "some_value" } } }此 JSON 访问起来可能很麻烦,因此
requestContext中使用的密钥采用claims_claimType_claimName格式。claimType为userinfo或idtoken。 请注意缺少下划线。 因此,在上一个示例中,可以使用requestContext.getValue('claims_idtoken_claim_name')来获取claim_name值。同样,
scope已计算并用空格分割以构建字符串数组。 - 身份源凭证
用户登录 Verify 时,身份源凭证属性被添加到登录会话中,并且可以在请求映射规则中访问。
idsuser域对象以具有字符串键和字符串数组值的映射形式提供。 例如,
有关更多信息,请参阅属性函数。{ "realmName": ["cloudIdentityRealm"], "displayName": ["Jessica J. Hill"], "phone": ["+12324321234"] }- 其他函数和运算符
标准运算符和函数在映射规则中可用。 也可以使用 HTTP 客户机来发出出站请求。 其他受支持的功能包括散列和时间戳记。 请参阅属性函数中的相关章节。
返回对象
定制规则应返回包含字符串或对象的数组。 字符串是范围,而对象是具有附加信息以将它们与隐私目的相关联的范围。 参见管理隐私目的。
marketing 的 email 属性即被创建。 此外,personal:email 范围被授权,并且 personal_email_allowed 声明被添加至标识令牌。
[
{
"purpose": "marketing",
"attribute": "email",
"accessType": "read",
"value": "jhill@ibm.com",
"custom": {
"type": "personal"
},
"claims": {
"personal_email_allowed": true
},
"scope": "personal:email"
},
{
"purpose": "defaultEULA"
},
"profile",
"email"
] + requestContext.scope此处的列表完全替换所请求范围,并用于构建同意页面。 参见 “修改单点登录设置 OpenID ”页面。 如果目的是向用户请求更多同意,那么必须附加 requestScope.scope,如添加和移除范围示例中所示。
在此示例中,该数组可以采用两种类型 - 作为字符串的 OAuth 范围和具有更多上下文并导致更细粒度的同意授权记录的对象。 这些属性是允许在对象中使用的属性。
| 属性 | 类型 | 是否必需? | 描述 |
|---|---|---|---|
purpose |
字符串 | 是 | 管理隐私用途 |
attribute |
字符串 | 取决于目的 | 管理属性 |
accessType |
字符串 | 取决于目的 | 访问类型配置为具有数据隐私目的。 如果未提供,那么缺省为 default。 |
value |
字符串 | 否 | 指示更具体的同意请求。 例如,对特定电子邮件的同意。 |
custom |
JSON 对象。 JSON 属性值类型为字符串。 | 否 | 要添加到同意的任何其他上下文信息。 此属性可通过模板宏的形式显示在同意页面中。 |
claim |
JSON 对象。 JSON 属性值类型为字符串。 | 否 | 如果请求已授权,那么会将相应的声明添加到所发出的标识令牌中。 |
scope |
字符串 | 否 | 如果请求已授权,那么会将此值添加到被授权的范围。 |
required |
Boolean | 否 | 如果 required 设置为 true ,那么用户必须通过同意进行响应。 如果隐私策略决策指示永远无法接受同意,那么不需要此同意。 |
autoGrant |
Boolean | 否 | 如果 autoGrant 设置为 true ,那么不会提示用户同意,并且会自动授权同意项。 |
global |
Boolean | 否 | 如果 global 设置为 true ,那么记录的同意在所有应用程序中都是全局同意。 此属性与同意项目相关,例如用户仅接受一次的条款文件。 |
audience |
字符串 | 否 | 如果请求已获授权,该值将与应用程序中配置的受众列表和默认客户端 ID 一起添加到已授权的受众中。 |
- 添加和移除范围的示例
- 在此示例中,将添加新的许可请求对象并移除范围。
[ { "purpose": "defaultEula", "scope": "eula:default" } ] + requestContext.scope.filter(x, x != "badscope")
此规则在授权时向范围 eula:default 授权,并将其与 EULA 同意关联。 它还会从所请求范围列表中过滤掉 badscope 。
可以对同意页面进行定制,以显示通过此映射规则添加的同意请求的详细信息。 示例详见 OpenID 《连接请求映射开放银行意图ID》。