本页面适用于 Apigee 和 Apigee 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 的流变量