使用 OAuth 授权应用程序 2.0

OAuth 2.0 是授权的开放式标准。 OAuth授权框架允许用户授予第三方应用程序访问权限,使其能够访问存储在其他 HTTP中的信息,而无需共享其访问权限或全部数据。

WebSphere® Liberty 支持 OAuth 2.0,并且可以用作 OAuth 服务提供者端点和 OAuth 保护的资源实施端点。 Liberty 支持持久 OAuth 2.0 服务。 请参阅 配置持久 OAuth 2.0 服务。 可以使用 localStore 和客户机元素在本地定义客户机。 以下过程使用本地客户机来启用 OAuth 2.0 授权。

开始之前

SAF 安全性是 CICS®中的常见用例,此过程在示例中使用 SAF。

确保将 CICS 区域配置为使用 SAF 安全性,并将 SEC=YES 定义为系统初始化参数。

(可选) 您可以授予管理员用户对 SAF EJBROLE BBGZDFLT.com.ibm.ws.security.oauth20.clientManager的访问权。 安全角色 clientManager 控制对管理接口的访问,允许查询本地客户机以及创建持久本地客户机。 管理员用户控制 OAuth 2.0 本地客户机。

配置 Liberty Angel 进程以向 Liberty JVM 服务器提供认证和授权服务。 请参阅 Liberty 服务器 Angel 进程

有关 OAuth 的更多信息,请参阅 oauth-2.0

关于此任务

以下过程涵盖了如何:
  • 创建 Liberty JVM 服务器中提供的 OAuth 2.0 服务。
  • 创建本地配置的客户机。
  • 使用此本地客户机向依赖方应用程序 (也称为第三方 Web 应用程序) 授予 OAuth 2.0 令牌。
  • 使用此令牌可访问应用程序中的受保护资源。
限制: 持久 OAuth 2.0 服务不支持Db2® JDBC 类型 2 连接。

过程

  1. 配置 OAuth 2.0 服务提供者。
    1. oauth-2.0cicsts:security-1.0 功能部件添加到 server.xml中的 featureManager 元素。
      <featureManager>
          ...
          <feature>oauth-2.0</feature> 
          <feature>cicsts:security-1.0</feature>
      </featureManager>
      ...
    2. server.xml中配置 OAuth 2.0 提供程序。
      <oauthProvider id="myProvider">
      </oauthProvider>
  2. 为依赖方应用程序配置本地客户机。 本地客户机定义依赖方应用程序的详细信息,包括应用程序的名称,密钥密码和重定向 URI。
    1. 定义有意义的本地客户机名称,并创建服务器用于授权的密钥密码。 本地客户机应用程序侦听 URI ,服务器提供授权代码。
    2. server.xmloauthProvider 元素中配置 OAuth 2.0 本地客户机,提供本地客户机标识,密钥密码和重定向 URI。
      <oauthProvider id="myProvider">
          <localStore>        
              <client id="myClient" redirect="https://client.example.ibm.com/webApp/redirect" secret="mySecret" />
          </localStore>
      </oauthProvider>
      
      重要说明:

      虽然此示例中未显示此值,但对密码进行编码并限制对 server.xml 配置的访问权非常重要。 可以使用在 USS_HOME/wlp/bin/securityUtility中找到的 Liberty securityUtility对密码进行编码。 有关更多信息,请参阅 securityUtility 命令

      注: 可以在 localStore 元素中配置多个本地客户机。
  3. 当依赖方应用程序需要访问服务器上的受保护资源时,用户必须首先授权访问这些资源。
    1. 依赖方应用程序要求用户向服务器进行认证,并通过将用户链接或重定向到授权端点来选择依赖方应用程序的访问类型:
      https://hostname:port/oauth2/endpoint/provider_name/authorize

      https://hostname:port/oauth2/declarativeEndpoint/provider_name/authorize

      URL需要添加其他参数。 对于在步骤 2 中配置的本地客户机,需要以下 GET 请求 (全部一行):

      https://zos.example.ibm.com/oauth2/endpoint/myProvider/authorize?response_type=code
         &client_id=myClient&client_secret=mySecret&redirect_uri=https://client.example.ibm.com/webApp/redirect

      用户选择依赖方应用程序的访问权后,将使用重定向 URI 将其重定向回依赖方应用程序:

      https://client.example.ibm.com/webApp/redirect?code=access_code

      依赖方应用程序必须存储此访问代码以请求 OAuth 令牌。

      注: 对于本地客户机,用户必须存在于 Liberty JVM 服务器中的用户寄存器中。 有关在 Liberty JVM 服务器中认证用户的更多信息,请参阅 在 Liberty JVM 服务器中认证用户
    2. 依赖方应用程序通过向服务器发送 POST 请求来请求 OAuth 2.0 令牌:
      https://hostname:port/oauth2/endpoint/provider_name/token

      依赖方应用程序发送从授权端点接收的授权代码,本地客户机标识和 POST 数据中的私钥密码 (grant_type 都是一行):

      POST https://zos.example.ibm.com/oauth2/endpoint/myProvider/token HTTP/1.1
      Content-Type: application/www-form-urlencoded
      
      grant_type=authorization_code&code=code&client_id=myClient
         &client_secret=mySecret&redirect_url=https://client.example.ibm.com/webApp/redirect

      这将返回包含令牌的 JSON 文档。

  4. 使用令牌来访问受保护资源。
    1. HTTP的 Authorization 报头中添加令牌。
      Authorization: Bearer <token>

结果

用户能够授权第三方应用程序通过 OAuth 2.0 授权流访问其在 Liberty JVM 服务器中的受保护资源。 Liberty JVM 服务器可以配置这些令牌的提供程序并创建本地配置的客户机。

提供了几种授予令牌的方法。 有关更多信息,请参阅 OAuth 2.0 服务调用