同意请求的 OpenID Connect 请求映射

OAuth 和 Open ID Connect 授权流程可能会向用户提供请求授权的许可提示。

授权流程可以请求授权以执行下列操作。
  • 共享用户概要文件中的数据,例如,电子邮件地址。 可以选择用指示共享数据的目的的信息来补充此请求。
  • 代表用户执行操作,例如,在寒冷天气启动用户的车辆并加热或发起付款。
通常,应用程序会通过参数 scope 的形式向该操作发起请求。 不过,有时可能需要修改该请求。 例如,
  • 请务必检查用户许可协议中的用户授权状态。
  • 根据用户的认证会话来过滤掉特定 scope 值。
  • 添加更多上下文以指示请求数据的原因,无论是在 scope 中进行编码(例如,email_for_billing),还是作为另一个请求参数(例如,authorization_details)的一部分提供。

此类型的修改可以通过使用同意请求参数的定制规则来实现。 参见 “属性函数 ”。 可以使用简单的单行表达式语言或更高级的基于 YAML 的多行文档来编写规则。 请参阅多行规则执行程序

可用的输入对象

因为此定制规则在认证之后但在授权之前运行,所以可用信息不包括所有可能的域对象。 它们被限制为以下类型。

HTTP 请求上下文
用户登录 Verify 时,可以在请求/映射规则中访问入局 HTTP 请求上下文。 所有 OAuth 请求参数(例如,claimsscope)在此 requestContext 中可用。 关于 requestContext 的一般结构和使用方法,请参阅 “属性函数 ”中的“ HTTP 请求上下文”一节。
为了简化访问,在 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 格式。 claimTypeuserinfoidtoken。 请注意缺少下划线。 因此,在上一个示例中,可以使用 requestContext.getValue('claims_idtoken_claim_name') 来获取 claim_name 值。

同样,scope 已计算并用空格分割以构建字符串数组。

身份源凭证

用户登录 Verify 时,身份源凭证属性被添加到登录会话中,并且可以在请求映射规则中访问。

idsuser 域对象以具有字符串键和字符串数组值的映射形式提供。 例如,
{
  "realmName": ["cloudIdentityRealm"],
  "displayName": ["Jessica J. Hill"],
  "phone": ["+12324321234"]
}
有关更多信息,请参阅 “属性函数 ”。
其他函数和运算符

标准运算符和函数在映射规则中可用。 也可以使用 HTTP 客户机来发出出站请求。 其他受支持的功能包括散列和时间戳记。 请参阅 “属性函数 ”中的相关章节。

返回对象

定制规则应返回包含字符串或对象的数组。 字符串是范围,而对象是具有附加信息以将它们与隐私目的相关联的范围。 参见 …… /tasks/t_manage_purposes.html

以下代码是返回对象的示例。 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 字符串 ../tasks/t_manage_purposes.html
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 Connect 请求映射的开放银行意图 ID