65.9K
CodeProject 正在变化。 阅读更多。
Home

OTDS 身份验证的 OAuth 2.0

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2023 年 6 月 14 日

CPOL

6分钟阅读

viewsIcon

5264

本文档提供了将 OTDS 10.5 Patch 6 配置为 OAuth 2.0 授权服务器的分步指南。它还通过一个示例场景,演示了如何使用 OAuth 2.0 资源所有者密码凭据授权访问 RESTful API。

本文档详细介绍了如何将 OTDS 10.5 Patch 6 配置为 OAuth 2.0 授权服务器,并通过一个示例场景,演示了如何使用 OAuth 2.0 资源所有者密码凭据授权来授权访问 RESTful API。

必备组件

  • OTDS 10.5 Patch 6(或更高版本)。您可以在 OpenText Knowledge Centre 此处下载。

安装和配置 OTDS

有关安装和基本配置的详细信息,请参阅 OTDS 文档

本文档假设您的 OTDS 主机地址为 https://:8080

您至少需要一个非同步用户分区,其中配置了用户条目以使用密码凭据进行登录。换句话说,如果您有一个用户可以登录到您的 OTDS 登录页面:https://:8080/otdsws/login,那么您就可以开始了(至少,这可以是您的管理员用户 [email protected])。

启用 HTTP 上的 OAuth 2.0

OAuth 2.0 要求所有 OAuth 2.0 流量都通过 SSL / TLS 安全通道进行。默认情况下,OTDS 会遵守此规则,但出于开发原因,可以配置为允许通过 HTTP 进行 OAuth 2.0 流量。建议您在开发环境中启用此功能以协助调试。

要访问 OTDS 管理 UI,请在浏览器中打开 https://:8080/otds-admin/

以用户 [email protected] 的身份登录 OTDS Web 管理控制台,找到系统属性页面。单击“添加”,然后添加一个名为 directory.auth.EnforceSSL、值为 false 的系统属性,然后单击“保存”。

创建您的 OTDS OAuth 2.0 客户端分区

目前,注册客户端是一个手动过程。OTDS 将每个 OAuth 2.0 客户端表示为名为 OAuthClients 的特殊用户分区中的一个用户。创建此分区。

您需要查看分区成员才能创建一个代表您的 OAuth 2.0 客户端的用户。

注意:本文档假设正在创建的客户端无法保守 OAuth 2.0 客户端机密(例如,基于浏览器的 Web 应用程序或本地移动客户端),因此我们在此不为“用户”指定密码。给客户端起一个名字,然后单击“保存”。

注意:OTDS 假定所有客户端都创建在 OAuthClients 用户分区的位置(组织单位)。请在分区的“用户”选项卡上验证这一点。

创建代表您的服务/OAuth 2.0 资源的 OTDS 资源

您的客户端将通过 API 访问您的资源。OTDS 需要了解您的资源,这通过 OTDS 资源对象进行建模。您需要创建一个 OTDS 资源,并将您的用户分配给为该资源创建的访问角色。完成以下步骤。

从“资源”选项卡创建新的 OTDS 资源。

只需为其命名,然后单击“保存”。

您将看到一个屏幕,告知您需要激活新资源。这是一次性操作,通常在您的 OpenText 服务器产品中启用 OTDS 集成时进行。

复制资源标识符并记下资源名称。

为了本文档的目的,我们将使用 OTDS Swagger 页面来激活资源。在浏览器中,访问 https://:8080/otdsws/api/#!resources,然后展开“激活资源”部分。输入上一步中的资源标识符,然后单击“试用”!一切顺利,您将看到响应代码 200。您还将看到响应值 secret_key,出于本教程的目的,您可以忽略它。

接下来,您需要授予某些用户访问新创建的资源的权限。在此示例中,我将授予管理用户分区中的任何用户访问我的资源的权限。

在管理 UI 中,找到为您的资源自动创建的 OTDS 访问角色,然后单击“操作”/“查看访问角色详细信息”。

要确保您希望针对新资源进行身份验证的用户能够访问,请确保他们或他们所属的容器已添加到访问角色中。在此,我添加了整个 otds.admin 分区,因为我将使用 [email protected] 用户进行测试。

关闭对话框,然后单击“保存”。

现在您已准备好使用 OAuth 2.0 进行身份验证。

获取 OAuth 2.0 访问令牌和刷新令牌

OTDS 公开的 OAuth 2.0 tokenauthentication 端点都位于 https://:8080/otdsws/login。要请求访问令牌,您需要将以下参数 POST 到此端点。

+------------+----------------------------+------------------------------------------------------+
| Name       | Value                      | Notes                                                |
+------------+----------------------------+------------------------------------------------------+
| grant_type | "password"                 | Informs the OAuth server that this request           |
|            |                            | is for Resource Owner Password Credentials           |
|            |                            | Grant                                                |
+------------+----------------------------+------------------------------------------------------+
| client_id  | <client-id>                | The name of the client - in this example             |
|            |                            | "pete-client-1"                                      |
+------------+----------------------------+------------------------------------------------------+
| username   | <user-id>                  | The user id - in this example                        |
|            |                            | "otadmin@otds.admin"                                 |
+------------+----------------------------+------------------------------------------------------+
| password   | <password>                 | The password for the user to authenticated           |
+------------+----------------------------+------------------------------------------------------+
| scope      | "resource:"<resource+name> | The scope is tied to a single resource, and          |
|            |                            | is formatted as "resource:<resource+name>",          |
|            |                            | where the <resource+name> is the name of             |
|            |                            | your resource, but with any spaces replaced with "+" |
+------------+----------------------------+------------------------------------------------------+

重要:如果您的资源名称包含空格,则必须将其替换为“+”字符。例如,scope=resource:My Resource 变为 scope=resource:My+Resource

以下是一个请求示例。

POST http://otds.myhost.com:8080/otdsws/login HTTP/1.1
Accept: application/x-www-form-urlencoded
Content-Type: application/x-www-form-urlencoded
User-Agent: Jersey/2.19 (HttpUrlConnection 1.8.0_45)
Host: otds.myhost.com:8080
Connection: keep-alive
Content-Length: 133

password=****&grant_type=password&scope=resource%3Apete-test-server-1&client_id=pete-client-1&username=otadmin%40otds.admin

如果请求获得批准,您将看到一个包含以下属性的响应,作为 JSON 对象返回。

+---------------+-------------------------------------------------------------+
| Name          | Notes                                                       |
+---------------+-------------------------------------------------------------+
| access_token  | The OAuth 2.0 Access Token                                  |
+---------------+-------------------------------------------------------------+
| expires_in    | The expiry time of the granted token, in seconds            |
+---------------+-------------------------------------------------------------+
| refresh_token | Used to request a new access_token (e.g. once the delivered |
|               | token has expired or is about to expire)                    |
+---------------+-------------------------------------------------------------+
| token_type    | Always "Bearer" for this flow                               |
+---------------+-------------------------------------------------------------+

以下是一个响应示例。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Date: Fri, 07 Aug 2015 15:43:02 GMT

3ea
{"token_type":"Bearer","expires_in":3600,"refresh_token":"ABQkq...","access_token":"ABSrk..."}
0

使用访问令牌访问资源 API

当客户端调用 REST 端点时,它应将提供的访问令牌包含在标准的 HTTP Authorization 标头中,格式为 Authorization: Bearer <access-token>。以下是一个请求示例。

GET http://poliver-e6520:8080/myresource/webresources/rest HTTP/1.1
Accept: application/json
Authorization: Bearer ABTYWpGvDKHyv5KfC<snip>Gv6wdbDo
User-Agent: Jersey/2.19 (HttpUrlConnection 1.8.0_51)
Host: poliver-e6520:8080
Connection: keep-alive

从资源服务器验证访问令牌

在上述步骤中,您的客户端请求了一个特定资源的访问令牌。当客户端发出 API 请求时,它会在 Authorization 标头中提供访问令牌,如上所示。

当资源在 OTDS 中注册时,它被分配了一个资源标识符。当您的资源服务器希望验证访问令牌时,它必须将授予的访问令牌和资源标识符作为一个 JSON 对象提交给 OTDS 进行验证,提交到 OTDS REST 端点 https://:8080/otdsws/v1/authentication/tokeninfo,如下例所示。

POST https://:8080/otdsws/v1/authentication/oauth/tokeninfo HTTP/1.1
Accept: application/json
Content-Type: application/json
User-Agent: Jersey/2.5.1 (HttpUrlConnection 1.8.0_51)
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8080
Connection: keep-alive
Content-Length: 505

{"token":"ABTYWpG<snip>6wdbDo","resource_id":"60832916-a568-4980-99da-f0338f899224"}

如果访问令牌有效,OTDS 将响应有关令牌创建的用户帐户的各种详细信息。如果令牌无效、属于不同资源或已过期,OTDS 将相应地响应一条描述性错误消息。

下表列出了预期的 HTTP 状态码和原因。

+-------------+-----------------------------------------------------------------------------+
| HTTP Status | Notes                                                                       |
+-------------+-----------------------------------------------------------------------------+
|     200     | OK - Token info is returned                                                 |
+-------------+-----------------------------------------------------------------------------+
|     401     | User does not have access to the specified resource, or error parsing token |
+-------------+-----------------------------------------------------------------------------+
|     410     | Expired or revoked token                                                    |
+-------------+-----------------------------------------------------------------------------+
|     400     | Invalid resource ID                                                         |
+-------------+-----------------------------------------------------------------------------+

刷新访问令牌

客户端可以在任何时候通过将刷新令牌与最初指定的客户端 ID 和 refresh_token 的授权类型一起 POST 到 OTDS OAuth 令牌端点 https://:8080/otdsws/login 来请求新的访问令牌。

+---------------+----------------------------+---------------------------------------------------+
| Name          | Value                      | Notes                                             |
+---------------+----------------------------+---------------------------------------------------+
| grant_type    | "refresh_token"            | Informs the OAuth server that this request        |
|               |                            | is for a token refresh                            |
|               |                            | Grant                                             |
+---------------+----------------------------+---------------------------------------------------+
| client_id     | <client-id>                | The name of the client - in this example          |
|               |                            | "pete-client-1"                                   |
+---------------+----------------------------+---------------------------------------------------+
| refresh_token | <refresh-token>            | The refresh token                                 |
+---------------+----------------------------+---------------------------------------------------+

建议您的客户端预emptive执行此操作,而不是在收到资源身份验证错误后执行。事实上,许多客户端 OAuth 框架会自动为您执行此操作。

以下是一个请求示例。

POST https://:8080/otdsws/login HTTP/1.1
Accept: application/x-www-form-urlencoded
Content-Type: application/x-www-form-urlencoded
User-Agent: Jersey/2.19 (HttpUrlConnection 1.8.0_51)
Host: localhost:8080
Connection: keep-alive
Content-Length: 547

refresh_token=ABRT0Eh<snip>PSgZvnGA*&grant_type=refresh_token&client_id=pete-client-1

以下是一个响应示例。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Date: Fri, 07 Aug 2015 18:25:07 GMT

21f
{"token_type":"Bearer","expires_in":3600,"access_token":"ABQ96H4xDG<snip>yl1_HKuIM*"}
0

撤销刷新和访问令牌

您可以通过向 OTDS 服务器发出 DELETE 请求来撤销访问令牌,URL 为 https://:8080/otdsws/v1/authentication/oauth/<token>

以下是一个请求示例。

DELETE https://:8080/otdsws/v1/authentication/oauth/ABTbx9R3<snip>CQUf_79al14N HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 0
Content-Type: application/json

这将产生以下示例响应。

HTTP/1.1 204 No Content
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: https://:8080
Access-Control-Allow-Methods: DELETE, HEAD, GET, OPTIONS, POST, PUT
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 1728000
Content-Type: application/json
Date: Fri, 07 Aug 2015 18:36:55 GMT

当 OTDS 收到撤销访问令牌的请求时,任何关联的刷新令牌也将被撤销。

© . All rights reserved.