本教程将向您展示如何使用 API 管理器将 OIDC ( OpenID Connect) 功能添加到现有的本地 OAuth 提供程序中。
关于本教程
OpenID Connect 是认证协议,其与 OAuth 一起控制用户对资源的访问。 使用 OAuth 来确定用户的权限时,还可以使用 OIDC 来通过使用 JSON Web 令牌 (JWT) 来认证用户。
准备工作
本教程使用预定义 FindBranch API 和通过“访问代码”授权类型配置的现有本机 OAuth 提供者。 要为本教程准备环境,请完成以下任务:
- 按照创建和配置目录中的说明,将 DataPower® API Gateway 网关服务添加到沙盒目录中。
必须配置沙箱目录以使用至少一个网关。 对于本教程,您必须使用 FindBranch API 所使用的相同网关。
- 导入 FindBranch API 并按照教程:导入 API 中的说明激活它。
- 按照教程:实现 OAuth 安全性中所述创建 MyNativeOAuthProvider 本机 OAuth 提供程序。
将 OIDC 功能添加到 OAuth 本机提供者
要向本机 OAuth 提供者添加 OIDC 安全性,请完成以下步骤:
- 打开 OAuth 提供者以进行编辑:
- 登录 API 管理器。
- 在主页上,单击管理资源磁贴。
- 在“资源”导航列表中,单击 OAuth 提供者。
- 在 OAuth 提供者列表中,单击 MyNativeOAuthProvider 以将其打开。
- 在编辑本地 OAuth 提供程序导航列表中,单击 OpenID Connect。

- 在 OpenID Connect 页面,选择启用 OIDC。

- 如果在页面上的支持混合响应类型列表中选择了任何设置,请清除这些选择。
- 选择自动生成 OIDC API 组合件。
此选项将使用 OIDC 的流更新 API。

消息显示警告,您必须提供标识令牌签名加密密钥对象或标识令牌签名密钥。 在本教程中,您提供 JWK 密钥(在下一步中)。
- 单击
复制以下密钥,然后将其粘贴到 ID 令牌签名密钥字段:{ "alg": "HS256", "kty": "oct", "use": "sig", "k": "o5yErLaE-dbgVpSw65Rq57OA9dHyaF66Q_Et5azPa-XUjbyP0w9iRWhR4kru09aFfQLXeIODIN4uhjElYKXt8n76jt0Pjkd2pqk4t9abRF6tnL19GV4pflfL6uvVKkP4weOh39tqHt4TmkBgF2P-gFhgssZpjwq6l82fz3dUhQ2nkzoLA_CnyDGLZLd7SZ1yv73uzfE2Ot813zmig8KTMEMWVcWSDvy61F06vs_6LURcq_IEEevUiubBxG5S2akNnWigfpbhWYjMI5M22FOCpdcDBt4L7K1-yHt95Siz0QUb0MNlT_X8F76wH7_A37GpKKJGqeaiNWmHkgWdE8QWDQ", "kid": "hs256-key" }
此密钥不安全,仅用于本教程。
- 在标识令牌签名算法字段中,选择 HS256 作为此密钥的签名算法。

- 单击保存。
测试 OIDC 安全性
注意: 由于跨源资源共享 (CORS) 限制,汇编测试工具不能在 macOS Catalina 平台上与 Chrome 或 Safari 浏览器一起使用。
在 API 管理器测试面板中测试新的 OIDC 安全性时,需要完成与测试本地 OAuth 提供程序相同的步骤。 “测试”面板不显示随访问令牌一起收到的 JWT 令牌,因此在本教程中,您将使用 cURL 命令来获取 JWT 令牌,以便您可以验证是否返回令牌。
- 设置“测试”面板以调用 API:
- 在 " 开发/查找分支 "页面,单击页面标题中的 " 测试 "选项卡。
导入的 FindBranch API 已有一个定义,它使用名为 Invoke 的单一策略来执行 API。 此 API 已准备好进行测试。
- 要激活 API,请单击 " 目标配置 "。

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

- 单击发送。

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

此时将打开新的浏览器标签。 如果出现错误信息,请忽略。
- 切换到命令窗口并使用 cURL 命令来获取允许您使用 API 的访问令牌和 JWT 令牌:
注意: 您从 OAuth 提供商处收到的授权码将在几分钟后失效。 为避免重复请求,请在执行第一个命令前,尽可能准备好此步骤的两个命令。
- 运行以下 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_type 为 code,因为您要接收授权代码。
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
- 复制授权代码(在
code 参数中返回),从而可在下一步中使用。
- 运行以下 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 令牌。
- 返回 "测试 "面板,单击 " 发送 " 以执行 API。
您无需将任何代码粘贴到“测试”面板,因为您使用 cURL 与 API
Connect 交换令牌。
FindBranch API 的响应会显示状态代码200
OK和响应头信息,正文则包含每个银行分行的数据。

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