[apigee]如何阻止请求命中默认后端目标

时间:2014-12-02 12:41:05

标签: apigee

我想限制对API代理中不存在的资源的请求,而不是命中"默认"目标。

一种方法是添加允许访问的API产品中的所有资源,但这需要在请求中传递api密钥。在我的情况下,api密钥不会在请求中传递。

请建议如何对阻止请求进行此检查。

1 个答案:

答案 0 :(得分:0)

首先,如果您的资源都在像/ v1这样的基本路径中,那么您应该创建一个" catch-all"将阻止/ v1 API组中的任何内容的API。创建一个没有目标的新API和/的基本路径然后你可以在那里放置一个指定消息或引发故障策略,返回404错误。这看起来像是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <Flows/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <FaultRules/>
                <Name>fault-not-found</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>
    <HTTPProxyConnection>
        <BasePath>/</BasePath>
        <VirtualHost>default</VirtualHost>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="noroute"/>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
</ProxyEndpoint>

然后,您需要在/ v1中定义每个资源,但在代理上创建一个没有条件的端点 - 请注意,这必须位于所有其他端点的末尾(列为&#34;流& #34;在XML中)。当Apigee遇到每个条件时(proxy.pathsuffix MatchesPath&#34; / resource-1&#34;)它将停止处理其他流程。

因此,如果它到达最终的Flow会引发错误,那么您的API使用者将被阻止:

<Flows>
    <Flow name="Resource 1">
        <Description/>
        <Request/>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath &quot;/resource-1&quot;) and (request.verb = &quot;GET&quot;)</Condition>
    </Flow>
    <Flow name="Resource 2">
        <Description/>
        <Request/>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath &quot;/resource-2&quot;) and (request.verb = &quot;GET&quot;)</Condition>
    </Flow>
    <Flow name="catchall">
        <Description/>
        <Request>
        <Step>
            <FaultRules/>
            <Name>fault-not-found</Name>
        </Step>
        <Response/>
    </Flow>
</Flows>