在 Apigee 中,如何使用 AccessEntity 策略以及稍后在 Javascript 中为开发人员获取自定义属性值?

Posted

技术标签:

【中文标题】在 Apigee 中,如何使用 AccessEntity 策略以及稍后在 Javascript 中为开发人员获取自定义属性值?【英文标题】:In Apigee, how to get a custom attribute value for a developer using the AccessEntity policy and later in Javascript? 【发布时间】:2014-03-23 19:06:19 【问题描述】:

分配给开发人员的自定义属性称为“XYZ”。在 API 代理中,如何使用 AccessEntity 策略(以及教程中给出的 AssignMessage 和 ExtractVariable 策略:http://apigee.com/docs/api-services/content/retrieve-entity-profiles-using-accessentity)来检索它的值,以便可以在 javascript 中进一步访问它?教程文档中给出的例子不是很清楚。

我有以下不工作的配置。 'XYZ' 是开发者自定义属性的名称:

AccessEntity 政策-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessEntity async="false" continueOnError="false" enabled="true" name="access-developer-attribute">
    <DisplayName>AccessEntity Developer Attribute</DisplayName>
    <FaultRules/>
    <Properties/>
    <EntityIdentifier ref="XYZ"></EntityIdentifier>
    <EntityType value="developer"></EntityType>
</AccessEntity>

AssignMessage 政策 -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="convert-accessentity-xml-to-message-request">
    <DisplayName>Convert AccessEntity Xml To Message Request</DisplayName>
    <FaultRules/>
    <Properties/>
    <Set>
        <Headers/>
        <QueryParams/>
        <FormParams/>
        <Verb/>
        <Path/>
        <Payload type="text/xml">AccessEntity.access-developer-attribute</Payload>
    </Set>
    <AssignVariable>
        <Name>name</Name>
        <Value/>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">accessentity.XYZ-attribute</AssignTo> 
</AssignMessage>

ExtractVariables 政策 -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables async="false" continueOnError="false" enabled="true" name="retrieve-developer-attribute">
    <DisplayName>Retrieve Developer Domain</DisplayName>
    <FaultRules/>
    <Properties/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Source>accessentity.XYZ-attribute</Source> 
    <VariablePrefix>developer_attribute</VariablePrefix>
    <XMLPayload stopPayloadProcessing="false">
        <Namespaces/>
        <Variable name="xyz" type="string">
            <XPath>/Developer/Attributes/XYZ</XPath>
        </Variable>
    </XMLPayload>
</ExtractVariables>

Javascript -

var xyzValue = context.getVariable("developer_attribute.xyz");

【问题讨论】:

【参考方案1】:

AccessEntity 中的EntityIdentifier ref 指的是一个变量,用于标识要引用的开发者。您可以传入多种类型的数据来识别开发者(developeremail、developerid、appid、consumerkey)。最好在 EntityIdentifier 元素中包含正在使用的数据类型。在下面的示例中,消费者密钥存储在变量 client_id 中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessEntity async="false" continueOnError="false" enabled="true" name="access-developer-attribute">
    <DisplayName>AccessEntity Developer Attribute</DisplayName>
    <EntityIdentifier ref="client_id" type="consumerkey"></EntityIdentifier>
    <EntityType value="developer"></EntityType>
</AccessEntity>

此外,您的 AssignMessage 策略未正确从 AccessEntity.access-developer-attribute 变量中检索。您需要在变量名称周围加上花括号,否则有效负载将是文本“AccessEntity.access-developer-attribute”。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="convert-accessentity-xml-to-message-request">
    <DisplayName>Convert AccessEntity Xml To Message Request</DisplayName>
    <Set>
        <Payload type="text/xml">AccessEntity.access-developer-attribute</Payload>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">accessentity.XYZ-attribute</AssignTo> 
</AssignMessage>

您还会注意到我已删除策略中未使用的字段。这使政策更具可读性。

您的 ExtractVariables 和 JavaScript 应该可以正常工作。

【讨论】:

感谢您澄清 AccessEntity 中的 EntityIdentifier 引用是指标识要引用的开发人员的变量。在我的用例中,我需要识别已注册应用程序以使用 API 产品的开发人员。我应该使用 appid 来访问使用该特定 API 产品的开发人员吗?如果是这样,appid 在哪里可用?或者是否可以通过 API 产品名称来识别特定 API 产品的开发人员? 这真的取决于您在代理运行时所拥有的信息。如果您使用 OAuth 或 API 密钥验证(通过 OAuthV2 和 VerifyAPIKey 策略),则在验证令牌或 API 密钥后会自动填充自定义属性。在实践中,我发现我很少需要调用 AccessEntity。 感谢您的回答。在我理解“EntityIdentifier ref”后,我根据您的回答更正了 AccessEntity 和 AssignMessage。我还将 ExtractVariables 中的 Xpath 更正为 '/Developer/Attributes/Attribute/Name' 并包含 XPath '/Developer/Attributes/Attribute/Value' 以获取属性的值。那时一切都奏效了。谢谢。 这是一个很棒的主题!有没有办法将此 XYZ 自定义属性用作查询参数?基本上,以下场景是否可能 - 开发人员使用他的 API 密钥访问自定义属性,我们提取此自定义属性,然后将其用作发送到端点的请求中的查询参数之一? 嗨 Miroslav,绝对可以!您可以使用 AssignMessage 在现有负载上设置查询参数。请参阅 apigee.com/docs/api-services/content/… 上名为 GenerateRequest 的示例 AssignMessage,但您将使用 createNew="false" 将查询参数添加到现有消息。

以上是关于在 Apigee 中,如何使用 AccessEntity 策略以及稍后在 Javascript 中为开发人员获取自定义属性值?的主要内容,如果未能解决你的问题,请参考以下文章

ApiGee OAUTH 授权

在 Apigee 上设置用户特定权限

使用 Apigee 作为 Auth0 的身份验证存储替代品

如何将 Apigee 的跟踪控制台 HTTP 方法更改为 POST

在 Apigee 中使用 Query DSL 库的经验

让 Apigee 为客户端做身份验证(oauth)