教程:实施 OIDC 安全性

本教程将向您展示如何使用 API 管理器将 OIDC ( OpenID Connect) 功能添加到现有的本地 OAuth 提供程序中。

关于本教程

OpenID Connect 是认证协议,其与 OAuth 一起控制用户对资源的访问。 使用 OAuth 来确定用户的权限时,还可以使用 OIDC 来通过使用 JSON Web 令牌 (JWT) 来认证用户。

在本教程中,您将完成以下课程:
  1. 将 OIDC 功能添加到 OAuth 本机提供者
  2. 测试 OIDC 安全性

准备工作

本教程使用预定义 FindBranch API 和通过“访问代码”授权类型配置的现有本机 OAuth 提供者。 要为本教程准备环境,请完成以下任务:

  1. 按照创建和配置目录中的说明,将 DataPower® API Gateway 网关服务添加到沙盒目录中。

    必须配置沙箱目录以使用至少一个网关。 对于本教程,您必须使用 FindBranch API 所使用的相同网关。

  2. 导入 FindBranch API 并按照教程:导入 API 中的说明激活它。
  3. 按照教程:实现 OAuth 安全性中所述创建 MyNativeOAuthProvider 本机 OAuth 提供程序。

将 OIDC 功能添加到 OAuth 本机提供者

要向本机 OAuth 提供者添加 OIDC 安全性,请完成以下步骤:
  1. 打开 OAuth 提供者以进行编辑:
    1. 登录 API 管理器
    2. 在主页上,单击管理资源磁贴。
      管理资源磁贴
    3. 在“资源”导航列表中,单击 OAuth 提供者
    4. 在 OAuth 提供者列表中,单击 MyNativeOAuthProvider 以将其打开。
      新的 OAuth 提供程序
  2. 编辑本地 OAuth 提供程序导航列表中,单击 OpenID ConnectOIDC 表格
  3. OpenID Connect 页面,选择启用 OIDC

    OIDC 表格

  4. 如果在页面上的支持混合响应类型列表中选择了任何设置,请清除这些选择。
  5. 选择自动生成 OIDC API 组合件

    此选项将使用 OIDC 的流更新 API。

    自动生成设置

    消息显示警告,您必须提供标识令牌签名加密密钥对象或标识令牌签名密钥。 在本教程中,您提供 JWK 密钥(在下一步中)。

  6. 单击 “复制”图标 复制以下密钥,然后将其粘贴到 ID 令牌签名密钥字段:
    { "alg": "HS256", "kty": "oct", "use": "sig", "k": "o5yErLaE-dbgVpSw65Rq57OA9dHyaF66Q_Et5azPa-XUjbyP0w9iRWhR4kru09aFfQLXeIODIN4uhjElYKXt8n76jt0Pjkd2pqk4t9abRF6tnL19GV4pflfL6uvVKkP4weOh39tqHt4TmkBgF2P-gFhgssZpjwq6l82fz3dUhQ2nkzoLA_CnyDGLZLd7SZ1yv73uzfE2Ot813zmig8KTMEMWVcWSDvy61F06vs_6LURcq_IEEevUiubBxG5S2akNnWigfpbhWYjMI5M22FOCpdcDBt4L7K1-yHt95Siz0QUb0MNlT_X8F76wH7_A37GpKKJGqeaiNWmHkgWdE8QWDQ", "kid": "hs256-key" }

    此密钥不安全,仅用于本教程。

    标识令牌签名密钥
  7. 标识令牌签名算法字段中,选择 HS256 作为此密钥的签名算法。

    标识令牌签名算法

  8. 单击保存

测试 OIDC 安全性

注意: 由于跨源资源共享 (CORS) 限制,汇编测试工具不能在 macOS Catalina 平台上与 Chrome 或 Safari 浏览器一起使用。

API 管理器测试面板中测试新的 OIDC 安全性时,需要完成与测试本地 OAuth 提供程序相同的步骤。 “测试”面板不显示随访问令牌一起收到的 JWT 令牌,因此在本教程中,您将使用 cURL 命令来获取 JWT 令牌,以便您可以验证是否返回令牌。

  1. 设置“测试”面板以调用 API:
    1. 在 " 开发/查找分支 "页面,单击页面标题中的 " 测试 "选项卡。

      导入的 FindBranch API 已有一个定义,它使用名为 Invoke 的单一策略来执行 API。 此 API 已准备好进行测试。

    2. 要激活 API,请单击 " 目标配置 "。

      FindBranch 应用程序接口

    3. 在 " 首选项 "窗口中,切换 " 自动发布 ",将 API 状态设置为联机。

      测试面板

    4. 单击发送

      测试调用

    5. 如果出现 " 未收到回复 "信息,请单击 "打开服务器"

      无响应信息

      此时将打开新的浏览器标签。 如果出现错误信息,请忽略。

  2. 切换到命令窗口并使用 cURL 命令来获取允许您使用 API 的访问令牌和 JWT 令牌:
    注意: 您从 OAuth 提供商处收到的授权码将在几分钟后失效。 为避免重复请求,请在执行第一个命令前,尽可能准备好此步骤的两个命令。
    1. 运行以下 cURL 命令以请求 API 的授权代码:
      curl -k -i --header "Authorization: Basic dXNlcjpwYXNz"\
       --request GET "Authorization_URL\
      ?redirect_uri=https://example.com/redirect\
      &scope=openid+details\
      &response_type=code\
      &client_id=Client_ID"
      其中:
      • cURL 参数 -k 允许 cURL 执行操作,即使是不安全的服务器连接。
      • cURL 参数 -i 在输出中包含协议响应头,因此您可以在命令窗口中查看响应。
      • 授权头指定,您将使用基本认证向用户注册表(创建的 AuthURL 用户注册表)进行认证,并提供采用 base64 编码的密码(“pass”)。
      • 将从“测试”面板复制 Authorization_URL
      • redirect_uri 是在“沙箱测试应用程序”中配置的 OAuth 重定向 URL。
      • scope 指定了两个作用域(用 + 连接):您将访问的 API 的 details 作用域和授权您的 OIDC 作用域。
      • response_typecode,因为您要接收授权代码。
      • Client_ID 从测试面板的标识部分复制,确保您可以访问沙盒测试应用程序。
      示例:
      curl -k -i --header "Authorization: Basic dXNlcjpwYXNz"\
       --request GET "https://example.com/eb-org/sandbox/mynativeoauthprovider/oauth2/authorize\
      ?redirect_uri=https://example.com/redirect\
      &scope=openid+details\
      &response_type=code\
      &client_id=01c43d1620e0c4e6ded0dec20b5655d9"
      响应类似于以下示例:
      HTTP/1.1 302 Found
      Connection: Keep-Alive
      Transfer-Encoding: chunked
      X-RateLimit-Limit: name=default,100;
      X-RateLimit-Remaining: name=default,93;
      User-Agent: curl/7.55.1
      Accept: */*
      X-Client-IP: IP_address
      X-Global-Transaction-ID: 12df8d855e7e18ee00000681
      Location: https://example.com/redirect? code=AALxLnKixp9VIy3PvVKBwfbuTgNbwnZtHB6iS9b_BUw39UZZjUi2CeFdPYJZW0mgqNMtzFUhrsfu3FFiC9aGfHnJ3CqdIANqlo-v-DkQv7ELWw 
      Content-Type: text/xml
      Date: Fri, 27 Mar 2020 15:17:02 GMT
    2. 复制授权代码(在 code 参数中返回),从而可在下一步中使用。
    3. 运行以下 cURL 命令来交换访问令牌和 JWT 令牌的授权代码:
      curl -k -i --header "Content-Type: application/x-www-form-urlencoded"\
       --request POST "Token_URL"\
       --data-urlencode "code=Authorization_code"\
       --data-urlencode "client_secret=Client_Secret"\
       --data-urlencode "grant_type=authorization_code"\
       --data-urlencode "scope=openid details"\
       --data-urlencode "client_id=Client_ID"
      其中:
      • 将从“测试”面板复制 Token_URL
      • 从先前命令的响应复制 Authorization_code
      • 从“测试”面板的“标识”部分复制 Client_Secret
      • grant_type 为“authorization_code”。
      • scope 再次指定两个作用域(在此命令中用空格分隔,因为这些值用引号括起)。
      • 从“测试”面板的“标识”部分复制 Client_ID
      示例:
      curl -k -i --header "Content-Type: application/x-www-form-urlencoded"\
       --request POST "https://example.com/eb-org/sandbox/mynativeoauthprovider/oauth2/token"\
       --data-urlencode "code=AAJ8zz5SvYgxFw0zY0fOxAOiDeaw_PLR6dAFh-ojXVjv-80TB25VGfj28J4Jf7jzgaWVVfLQuVTRSfUbp2hDjYsX9QmZHJOg5p_bfHFWBlQlLg"\
       --data-urlencode "client_secret=d6634763de6c612ae69636d0fc948650"\
       --data-urlencode "grant_type=authorization_code"\
       --data-urlencode "scope=openid details"\
       --data-urlencode "client_id=01c43d1620e0c4e6ded0dec20b5655d9"
      响应类似于以下示例:
      {"token_type":"Bearer", "access_token":"AAIgMDFjNDNkMTYyMGUwYzRlNmRlZDBkZWMyMGI1NjU1ZDkm4gPMmFjgv2XXhI7t6LZ8BcIRaO_LvWirsNDlirJWi_7qqKGp_fr5py7yE_fHoD17ajAUJPPuUjsV5xj7go25JQjk_smS-AYvmPXRi99IxQ" ,"scope":"openid details","expires_in":3600,"consented_on":1585322249, "id_token":"eyJraWQiOiJoczI1Ni1rZXkiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3NjE2OTRiYS1iYjYzLTRlNWQtOTc1ZS04NThkZGYxMmI2ZTkiLCJpc3MiOiJJQk0gQVBJQ29ubmVjdCIsInN1YiI6InVzZXIiLCJhdWQiOiIwMWM0M2QxNjIwZTBjNGU2ZGVkMGRlYzIwYjU2NTVkOSIsImV4cCI6MTU4NTMyNTg1MiwiaWF0IjoxNTg1MzIyMjUyLCJhdF9oYXNoIjoibDZYRDV5SjVuMTU1MkZSV19pR2k2USJ9.IO1RVPWV5zOhYGmCXUvG0_-9OO0guURPwaEbGOqCpCg" }

      响应包括两个令牌:访问令牌和 JWT(标为 id_token )。 接收这些令牌以验证您使用 OIDC 和本机 OAuth 提供者进行认证。

      注意: 如果您收到Invalid request响应中出现关于过期代码的错误,则表示授权代码已过期。 返回到子步骤 a 并重复该过程以获取新的授权代码,然后快速进行交换以获取访问令牌和 JWT 令牌。
  3. 返回 "测试 "面板,单击 " 发送 " 以执行 API。

    您无需将任何代码粘贴到“测试”面板,因为您使用 cURL 与 API Connect 交换令牌。

    FindBranch API 的响应会显示状态代码200 OK和响应头信息,正文则包含每个银行分行的数据。

    成功调用 API 的响应

您在本教程中执行的操作

在本教程中,您完成了以下活动:
  • 向现有 API 添加了 OIDC 安全性。
  • 通过在调用 API 之前,手动请求授权代码并进行交换以获取访问令牌和 JWT 令牌,测试了安全性。