启用通过用户 ID 和应用 ID 访问 OAuth 2.0 令牌的功能

适用于私有云的 Edge v. 4.17.01

本文档介绍了如何按最终用户 ID 和/或应用 ID 启用检索和撤消 OAuth 2.0 访问令牌。

应用 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",
  "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",
  "refresh_count" : "0"
}

请注意以下几点:

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

如需按最终用户 ID 检索和撤消 OAuth 2.0 访问令牌,请配置 OAuth 2.0 政策,以便在令牌中包含用户 ID,如下面的过程所述。

最终用户 ID 是 Edge 用作开发者 ID 的字符串,而不是开发者的电子邮件地址。您可以使用 Get Developer API 调用,根据开发者的电子邮件地址确定开发者的 ID。

在配置 Edge 以将最终用户 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",
  "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",
  "refresh_count" : "0"
}

用于按用户 ID 和应用 ID 检索和撤消 OAuth 2.0 访问令牌的 API

您可以使用以下 API 按用户 ID 和/或应用 ID 访问 OAuth 令牌:

启用令牌访问权限的流程

按照以下步骤操作,按最终用户 ID 和应用 ID 检索和撤消 OAuth 2.0 访问令牌。

第 1 步:为组织启用令牌访问权限支持

您必须分别为每个组织启用令牌访问权限。针对您希望按最终用户 ID 或应用 ID 启用检索和撤消 OAuth 2.0 访问令牌的每个组织,调用以下 PUT API。

发出以下调用的用户必须具有组织的 orgadminopsadmin 角色。将 {curly braces} 中的值替换为您组织专用的值:

> curl -H "Content-type:text/xml" -X POST \
  https://<ms-ip>:8080/v1/organizations/{org_name} \
  -d '<Organization name="{org_name}">
      <Properties>
        <Property name="features.isOAuthRevokeEnabled">true</Property>
        <Property name="features.isOAuth2TokenSearchEnabled">true</Property>
      </Properties>
    </Organization>' \ 
  -u {userEmail}:{mypassword}

第 2 步:为组织中的 opsadmin 角色设置权限

只有组织中的 orgadminopsadmin 角色应获享根据用户 ID 或应用 ID 检索 (HTTP GET) 和撤消 (HTTP PUT) OAuth 2.0 令牌的权限。要控制访问权限,请为组织的 /oauth2 资源设置 get 和 put 权限。该资源的网址格式为:

https://<ms-ip>:8080/v1/organizations/{org_name}/oauth2

orgadmin 角色应该已经拥有必要的权限。对于 /oauth2 资源的 opsadmin 角色,其权限应如下所示:

<ResourcePermission path="/oauth2">
    <Permissions>
        <Permission>get</Permission>
        <Permission>put</Permission>
    </Permissions>
</ResourcePermission>

您可以使用 Get Permission for a Single Resource API 调用,查看哪些角色具有 /oauth2 资源的权限。

根据响应,您可以使用 Add Permissions for Resource to a Role Delete Permission for Resource API 调用,对 /oauth2 资源权限进行任何必要的调整。

使用以下 c网址 命令向 opsadmin 角色授予对 /oauth2 资源的 getput 权限。将 {大括号} 中的值替换为您组织特定的值:

> curl -X POST -H 'Content-type:application/xml' \
  http://<ms-ip>:8080/v1/organizations/{org}/userroles/opsadmin/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions>
        <Permission>get</Permission>
        <Permission>put</Permission>
      </Permissions>
    </ResourcePermission>' \
  -u {USEREMAIL}:{PWD} 

使用以下 c网址 命令,从 orgadminopsadmin 以外的角色撤消对 /oauth2 资源的 getput 权限。将 {curly braces} 中的值替换为您组织专用的值:

> curl -X DELETE -H 'Content-type:application/xml' \
  http://<msip>:8080/v1/organizations/{org-name}/userroles/{roles}/permissions \
  -d '<ResourcePermission path="/oauth2">
      <Permissions></Permissions>
    </ResourcePermission>' \
   -u {USEREMAIL}:{PWD} 

第 3 步:设置 oauth_max_search_limit 属性

确保将 /opt/apigee/customer/application/management-server.properties 文件中的 conf_keymanagement_oauth_max_search_limit 属性设置为 100:

conf_keymanagement_oauth_max_search_limit = 100

如果此文件不存在,请创建一个。

此属性用于设置提取令牌时使用的页面大小。Apigee 建议的值为 100,但您可以根据需要进行设置。

在全新安装时,该属性应已设置为 100。如果您必须更改此属性的值,请使用以下命令重启管理服务器和消息处理器:

> /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
> /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

第 4 步:配置 OAuth 2.0 政策,以便生成包含最终用户 ID 的令牌

配置用于生成访问令牌的 OAuth 2.0 政策,以便将最终用户 ID 包括在令牌中。将最终用户 ID 添加到访问令牌中后,您就可以按 ID 检索和撤消令牌了。

如需将政策配置为在访问令牌中包含最终用户 ID,创建访问令牌的请求必须包含最终用户 ID,并且您必须指定包含最终用户 ID 的输入变量。

下面的 OAuth 2.0 政策(名为 GenerateAccessTokenClient)会生成 OAuth 2.0 访问令牌。请注意,我们添加了粗体 <AppEndUser> 标记,用于指定包含最终用户 ID 的变量:

<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=k3nJyFJIA3p62TKIkLO6OJNXFmP&client_secret=gk5K5lIp943AY4'

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

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