我想限制对API代理中不存在的资源的请求,而不是命中"默认"目标。
一种方法是添加允许访问的API产品中的所有资源,但这需要在请求中传递api密钥。在我的情况下,api密钥不会在请求中传递。
请建议如何对阻止请求进行此检查。
答案 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 "/resource-1") and (request.verb = "GET")</Condition>
</Flow>
<Flow name="Resource 2">
<Description/>
<Request/>
<Response/>
<Condition>(proxy.pathsuffix MatchesPath "/resource-2") and (request.verb = "GET")</Condition>
</Flow>
<Flow name="catchall">
<Description/>
<Request>
<Step>
<FaultRules/>
<Name>fault-not-found</Name>
</Step>
<Response/>
</Flow>
</Flows>