同意请求的 OpenID Connect 请求映射

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

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

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

可用的输入对象

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

HTTP 请求上下文
用户登录 Verify 时,可以在请求/映射规则中访问入局 HTTP 请求上下文。 所有 OAuth 请求参数(例如,claimsscope)在此 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 格式。 claimTypeuserinfoidtoken。 请注意缺少下划线。 因此,在上一个示例中,可以使用 requestContext.getValue('claims_idtoken_claim_name') 来获取 claim_name 值。

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

身份源凭证

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

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

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

返回对象

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

以下代码是返回对象的示例。 当用户同意第一个请求对象时, marketingemail 属性即被创建。 此外,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》。