使用客户端凭证,客户端正在击中一个目标。但如何包含开发者应用名称呢?
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路径,返回应用程序的详细信息,让开发人员做两个调用,然后自己把它混在一起…