允许按最终用户 ID 和/或应用 ID 检索和撤消 OAuth 2.0 访问令牌

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

本部分介绍如何按最终用户 ID 和/或应用 ID 启用检索和撤消 OAuth 2.0 访问令牌。最终用户 ID 功能需要特殊设置,如本主题中所述。最终用户是指调用 API 的应用的用户。

何时启用最终用户 ID 访问权限

有时,将用户 ID 存储在访问令牌中很有用。只有在已明确用例的情况下,才能启用最终用户 ID 访问权限功能。例如:

  • 您的网站或应用的一项功能,可供用户查看他们已获授权使用哪些第三方应用,并提供撤消对这些应用的访问权限的选项。
  • 允许授权用户撤消与特定开发者应用关联的所有访问令牌的功能。

关于 OAuth 访问令牌

应用 ID 会自动添加到 OAuth 访问令牌中。因此,按照下文所述为组织启用令牌访问权限后,您可以按应用 ID 撤消访问令牌。

要按最终用户 ID 检索和撤消 OAuth 2.0 访问令牌,最终用户 ID 必须存在于访问令牌中。以下过程介绍了如何将最终用户 ID 添加到现有令牌。

默认情况下,当 Edge 生成 OAuth 2.0 访问令牌时,令牌的格式如下所示:

{
 "issued_at" : "1421847736581",
 "application_name" : "a68d01f8-b15c-4be3-b800-ceae8c456f5a",
 "scope" : "READ",
 "status" : "approved",
 "api_product_list" : "[PremiumWeatherAPI]",
 "expires_in" : "3599", //--in seconds
 "developer.email" : "tesla@weathersample.com",
 "organization_id" : "0",
 "token_type" : "BearerToken",
 "client_id" : "k3nJyFJIA3p62DWOkLO6OJNi87GYXFmP",
 "access_token" : "7S22UqXGJDTuUADGzJzjXzXSaGJL",
 "organization_name" : "myorg",
 "refresh_token_expires_in" : "0", //--in seconds
 "refresh_count" : "0"
}

请注意以下几点:

  • application_name 字段包含与令牌关联的应用的 UUID。如果启用按应用 ID 检索和撤消 OAuth 2.0 访问令牌的功能,则这是您使用的应用 ID。
  • access_token 字段包含 OAuth 2.0 访问令牌值。

默认 OAuth 访问令牌中没有最终用户 ID 的字段。要按最终用户 ID 检索和撤消 OAuth 2.0 访问令牌,您必须配置 OAuth 2.0 政策,以便在令牌中包含用户 ID,如下面的过程所述。请注意,如果您只想通过应用 ID 检索和撤消 OAuth 2.0 访问令牌,则无需按最终用户 ID 启用访问权限。

您将最终用户 ID 传递给令牌创建端点。您可以将最终用户 ID 作为查询参数、表单参数传递或在标头中传递(如本主题后面部分所述)。将 Edge 配置为在令牌中包含最终用户 ID 后,该 ID 将作为 app_enduser 字段添加,如下所示:

{
 "issued_at" : "1421847736581",
 "application_name" : "a68d01f8-b15c-4be3-b800-ceae8c456f5a",
 "scope" : "READ",
 "app_enduser" : "6ZG094fgnjNf02EK",
 "status" : "approved",
 "api_product_list" : "[PremiumWeatherAPI]",
 "expires_in" : "3599", //--in seconds
 "developer.email" : "tesla@weathersample.com",
 "organization_id" : "0",
 "token_type" : "BearerToken",
 "client_id" : "k3nJyFJIA3p62DWOkLO6OJNi87GYXFmP",
 "access_token" : "7S22UqXGJDTuUADGzJzjXzXSaGJL",
 "organization_name" : "myorg",
 "refresh_token_expires_in" : "0", //--in seconds
 "refresh_count" : "0"
}

如需了解如何进行 API 调用来执行这些检索和撤消操作,请参阅以下智能文档:

按用户 ID 和应用 ID 启用对 OAuth 2.0 令牌的访问权限

如何按用户 ID 和应用 ID 启用对 OAuth 2.0 令牌的访问权限取决于您部署 Edge 的方式:

  • 基于云端的部署

    基于云的 Edge 部署意味着大部分配置由 Apigee 处理。您只负责配置 OAuth 2.0 政策以将用户 ID 添加到访问令牌。如需了解详情,请参阅下面的过程。

  • Edge for Private Cloud

    在适用于私有云(本地)的 Apigee Edge 中,您全权负责配置。如需了解详情,请参阅操作和配置

  • Apigee Hybrid

    默认情况下,按用户 ID 启用对 OAuth 2.0 令牌的访问权限。您只负责配置 OAuth 2.0 政策以将用户 ID 添加到访问令牌。如需了解详情,请参阅下面的流程第 5 步。

在云端启用访问权限

第 1 步:启用组织以支持此功能

您必须为要支持此功能的每个组织启用此功能。

联系 Apigee Edge 支持团队,让他们更新您的组织。

第 2 步:为 opsadmin 和 orgadmin 角色提供 oauth2 资源权限

只应为 orgadminopsadmin 角色提供根据最终用户 ID 或应用 ID 针对 oauth2 资源执行这些检索 (get) 和撤消 (put) 调用的权限。

您可以使用 Get Permissions API 调用来查看哪些角色对 oauth2 资源具有 getput 权限。

如果您需要添加或移除任何权限,请与 Apigee Edge 支持团队联系,让他们执行更新。

第 3 步:将现有 OAuth 2.0 访问令牌复制到 Cassandra 节点

由 Apigee 支持团队执行:在此任务中,复制受影响组织中的现有 OAuth 2.0 访问令牌的副本并存储在 Cassandra 节点中。此过程将在每个 Apigee Edge pod 的 Cassandra 节点上执行。这将允许检索和撤消针对所有 OAuth 2.0 访问令牌(现有和新生成的)运行的 API 调用。

第 4 步:将 oauth_max_search_limit 属性添加到管理服务器和消息处理器

在此任务中,将更新管理服务器和消息处理器的 keymanagement.properties 文件以添加此属性:oauth_max_search_limit = 100100 是 Apigee 的推荐值,但您可以根据需要进行设置。

请与 Apigee Edge 支持团队联系,让其为您添加代码。

第 5 步:配置 OAuth 2.0 政策以生成包含最终用户 ID 的访问令牌

配置用于生成访问令牌的 OAuth 2.0 政策,以便将最终用户 ID 包括在令牌中。通过将最终用户 ID 包括在访问令牌中,您便可按最终用户 ID 执行检索和撤消操作。

要将政策配置为将最终用户 ID 包括在访问令牌中,您必须指定包含最终用户 ID 的输入变量。使用 <AppEndUser> 标记指定该变量。

下面的 OAuth 2.0 政策(名为 GenerateAccessTokenClient)会生成 OAuth 2.0 访问令牌。请注意以粗体显示的 <AppEndUser> 标记:

<OAuthV2 async="false" continueOnError="false" enabled="true" name="GenerateAccessTokenClient">
  <DisplayName>OAuth 2.0.0 1</DisplayName>
  <ExternalAuthorization>false</ExternalAuthorization>
  <Operation>GenerateAccessToken</Operation>
  <SupportedGrantTypes>
    <GrantType>client_credentials</GrantType>
  </SupportedGrantTypes>
  <GenerateResponse enabled="true"/>
  <GrantType>request.queryparam.grant_type</GrantType>
  <AppEndUser>request.header.appuserID</AppEndUser>
  <ExpiresIn>960000</ExpiresIn>
</OAuthV2>

然后,您可以使用以下 cURL 命令生成 OAuth 2.0 访问令牌,将用户 ID 作为 appuserID 标头传递:

curl -H "appuserID:6ZG094fgnjNf02EK" /
  https://myorg-test.apigee.net/oauth/client_credential/accesstoken?grant_type=client_credentials /
  -X POST /
  -d 'client_id=k3nJyFJIA3p62TKIkLO6OJNi87GYXFmP&client_secret=gk58jK5lIp943AY4'

在此示例中,appuserID 作为请求标头传递。您可以采用多种方法将信息作为请求的一部分进行传递。例如,作为替代方案,您可以:

  • 使用表单参数变量:request.formparam.appuserID
  • 使用提供最终用户 ID 的流变量