在访问令牌的响应中包含开发者应用程序



使用客户端凭证,客户端正在击中一个目标。但如何包含开发者应用名称呢?

 curl https://{org}-test.apigee.net/oauth/client_credential/
  accesstoken?grant_type=client_credentials -X POST -d 
  'client_id={consumer_key}&client_secret={consumer_secret}'

响应如下

   {  
  "issued_at" : "1382703699776",
   "application_name" : "8586c7b7-2936-4779-b7a6-97014e436d7d",
  "scope" : "READ",
  "status" : "approved",
  "api_product_list" : "[PremiumWeatherAPI]",
  "expires_in" : "3599",
  "developer.email" : "tesla@weathersample.com",
  "organization_id" : "0",
  "client_id" : "SJOaCEGohSu3vpNswMs5YdBlc2GOAh1J",
  "access_token" : "UAj2yiGAcMZGxfN2DhcUbl9v8WsR",
  "organization_name" : "myorg",
  "refresh_token_expires_in" : "0",
  "refresh_count" : "0"
   }

在响应中,我需要开发人员应用程序名称也与该秘密和密钥相关联。如何包含

https://{org}-test.apigee.net/oauth/client_credential/accesstoken是代理API调用,而不是管理服务器API调用。您可以完全控制令牌响应,包括添加和删除字段。事实上,我认为很少有所有默认返回字段都有意义的情况。

在执行GenerateAccessToken操作的OAuthV2策略中,使用以下配置:

<GenerateResponse enabled="false"/>

生成令牌后,flow将继续而不是立即返回。然后,您可以使用流变量手动创建响应。

例如,要只返回访问令牌、expires_in字段和应用程序名称,可以在响应流中使用以下AssignMessage:

<AssignMessage enabled="true" continueOnError="false" async="false" name="AccessTokenResponseCC">
    <AssignTo createNew="true" transport="http" type="response"/> 
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
        <Payload contentType="application/json" variablePrefix="%" variableSuffix="#">
{
    "access_token":"%oauthv2accesstoken.GenerateToken.access_token#",
    "expires_in":"%oauthv2accesstoken.GenerateToken.expires_in#",
    "app_name":"%apigee.developer.app.name#"
}
        </Payload>
    </Set>
</AssignMessage>

其中"GenerateToken"是创建访问令牌的OAuthV2策略的名称。在我的Apigee cloud org中,变量apigee.developer.app.name在令牌创建后填充。

请参阅OAuth流变量页面,了解更多可以使用的变量。

问题是,这是Apigee的最终响应,您无法在事后实际操作它(就像使用外部服务一样)。我看到的唯一选择是将Apigee与Apigee混搭,这会变得有点难看:

1)在callout中创建令牌:不是在流中附加OAuth策略来生成令牌,而是创建具有不同基路径的第二个流(类似于/otherfunctions/OAuth/token)。你的开发人员调用/v1/oauth/token,你将他们的凭据传递给/otherfunctions/oauth/token,它返回一个有效载荷,你现在可以在JavaScript中编辑或在AssignMessage有效载荷

2)从Apigee API获取开发者名称:这很棘手,因为你必须创建一个角色有限的Apigee Edge用户,这样你就不会在API代理中存储你的个人凭据,用户名和密码是你登录到管理服务器(见UI中的组织角色来创建自定义角色;通过使用有效的电子邮件地址注册来设置自定义用户,然后使用自定义角色将其添加到组织中。

Authorization: Basic {base64 management api username:password)
https://api.enterprise.apigee.com/v1/organizations/{org_name}/apps/{application_name} 

其中{application_name}是生成令牌时响应有效负载中的长UUID(例如8586c7b7-2936-4779-b7a6-97014e436d7d)。然后你就可以得到应用的名字,并把它和原来的有效负载混在一起。

你可能想要缓存调用api.enterprise.apigee.com,但即使这样你也会得到一个性能打击这样做。

或者,你可以构建一个单独的API路径,返回应用程序的详细信息,让开发人员做两个调用,然后自己把它混在一起…

最新更新