授权上下文的 OpenID Connect 请求映射

根据该配置,IBM® Verify 中的 OAuth 或 Open ID Connect 流可以执行授权操作。

这些流可以包含这些操作。

  • 评估访问策略。
  • 计算存储在授权中并用于构建标识令牌和自省响应的声明值。

上下文请求映射规则提供了一种机制来扩充从授权请求中收集的上下文。 例如,授权请求可能包含一个名为 contextID 的定制请求参数。 定制规则可以将 contextID 包含在对外部端点的 HTTP 请求中。 此 HTTP 请求的结果是一个对象,可以解压并添加到在访问策略评估和授权增补期间使用的 requestContext。 参见 r_attr_functions.html

可以使用简单的单行表达式语言或更高级的基于 YAML 的多行文档来编写规则。 参见多行规则执行器

可用的输入对象

因为定制规则在认证之后但在授权之前运行,所以可用信息不包括所有可能的域对象。 它们被限制为以下对象。
HTTP 请求上下文
用户登录 Verify 时,可以在请求映射规则中访问传入 HTTP 请求上下文。 所有 OAuth 请求参数(例如,claimsscope)在此 requestContext 中可用。 关于 的 requestContext 总体结构和使用方法,请参阅 r_attr_functions.html 中的“ HTTP 请求上下文”一节。
对于访问,在 requestContext 中预先计算了某些值。 claims 请求参数通常表示为 JSON 文件,如以下示例中所示。

{
    "id_token": { 
        "claim_name": { 
            "essential": false, 
            "value": "some_value"
        }
    },
    "userinfo": {
        "claim_name": { 
            "essential": false, 
            "value": "some_value"
        }
    }
}

此格式可能很繁琐,无法访问。 requestContext 中使用的密钥的格式为 claims_claimType_claimNameclaimTypeuserinfoidtoken(请注意,缺少下划线)。 因此,通过使用前面的示例,可以通过使用 requestContext.getValue('claims_idtoken_claim_name')来获取 claim_name 值。

同样,scope 由空间分隔符拆分以构建字符串数组。

身份源凭证
用户登录 Verify 时,身份源凭证属性将添加到登录会话中,并且可以在请求映射规则中进行访问。
idsuser 域对象以具有字符串键和字符串数组值的映射形式提供。 例如,

{
  "realmName": ["cloudIdentityRealm"],
  "displayName": ["Jessica J. Hill"],
  "phone": ["+12324321234"]
}
参见 r_attr_functions.html
其他函数和运算符
标准运算符和函数在映射规则中可用。 也可以使用 HTTP 客户机来发出出站请求。 其他受支持的功能包括散列和时间戳记。 请参阅 r_attr_functions.html 中的相关章节。

返回对象

此定制规则应该会返回 JSON 对象,并且每个 JSON 属性的值都应该是字符串数组。

以下示例是一个返回对象。

{
   "ageRange": ["toddler"],
   "interests": ["sleeping", "other_misc_activities"]
}
此返回值将进行处理,以后可以使用 requestContext.ageRangerequestContext.interests 在高级规则属性中进行访问。 高级规则属性可以在访问策略(例如,{{requestContext.ageRange[0] != 'toddler'}})中使用,也可以在授权 requestContext.interests 中映射属性。

示例 - 将偏好添加到标识令牌

以下代码是用于将 hobbies 添加到标识令牌的请求映射的定制规则的示例。

statements:
- context: "contextData := hc.getAsJSON('https://jke.com/users/' + idsuser.getValue('uid'), { 'Authorization': 'apikey supersecretkey' })"
- return: >-
   {
      "hobbies": request.Context.interests.filter(x, x != 'other')
   }
在此示例中,该规则将调用外部用户端点以获取有关该用户的其他信息。 它使用 idsuser 对象,该对象表示 Verify 上的用户已认证会话。 最后,该规则从响应中抽取 hobbies
注意: 此规则不进行任何形式的验证,尚不适用于生产环境。
可以通过以下方法来访问 hobbies