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

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

您可以使用 RevokeOAuthV2 政策按最终用户 ID 和/或应用 ID 撤消 OAuth 2.0 访问令牌。最终用户是指调用 API 的应用的用户。

何时将用户 ID 存储在访问令牌中

默认情况下,访问令牌中不包含用户 ID。有时,将用户 ID 存储在访问令牌中很有用。例如:

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

关于 OAuth 访问令牌

默认情况下,当 Apigee 生成 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 添加到令牌后,该令牌会作为 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"
}

配置政策

如需按用户 ID 撤消令牌,您必须先配置 OAuth 2.0 政策,以便将用户 ID 添加到访问令牌。将最终用户 ID 加入访问令牌后,您就可以按最终用户 ID 撤消令牌了。

要将政策配置为将最终用户 ID 包括在访问令牌中,您必须指定包含最终用户 ID 的输入变量。使用 <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>

以下是配置为按 EndUserId 撤消访问权限的示例 RevokeOAuthV2 政策:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RevokeOAuthV2 continueOnError="false" enabled="true" name="GetOAuthV2Info-1">
    <DisplayName>Get OAuth v2.0 Info 1</DisplayName>
    <EndUserId ref="request.header.appuserID"></EndUserId>
    <Cascade>false</Cascade>
</RevokeOAuthV2>

另请参阅撤消 OAuth V2 政策

下面的示例命令会生成一个令牌,并通过 appuserID 标头传递用户 ID:

curl -H "appuserID:6ZG094fgnjNf02EK" \
-H "Content-Type: application/x-www-form-urlencoded" \
  -H "Authorization: Basic c3FIOG9vSGV4VHo4QzAyg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ" \
  -X POST "https://apitest.acme.com/oauth/token" \
  -d "grant_type=client_credentials"

您可以通过其他方式将信息作为请求的一部分进行传递。例如,作为替代方案,您可以:

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