我希望限制对RESTful API中某些方法的访问。我试图通过简单的产品来实现这一点,允许访问资源/运动员*但我没有看到任何更好的控制方式,即我希望只允许GET请求而不是POST和DELETE。是否存在在产品的自定义资源路径部分中表达此语法的语法,或者我是否需要通过条件流来处理此问题,例如:检查产品名称是否可以访问?
答案 0 :(得分:1)
我用Scopes这样做,但最后我不得不做一点点kludge。这假设您至少使用access_tokens的client_credentials授权(VerifyAPIKey策略不直接支持范围)。
首先为/ v1 / content创建API代理(基本路径/ v1,路径后缀/内容)。然后创建两个资源。
<Flows>
<Flow name="Content Read">
<Description/>
<Request>
<Step>
<FaultRules/>
<Name>RegEx-Check-Scope-READ-Content</Name>
</Step>
</Request>
<Response />
<Condition>(proxy.pathsuffix MatchesPath "/content") and (request.verb = "GET")</Condition>
</Flow>
<Flow name="Content Create">
<Description/>
<Request>
<Step>
<FaultRules/>
<Name>RegEx-Check-Scope-POST-Content</Name>
</Step>
</Request>
<Response />
<Condition>(proxy.pathsuffix MatchesPath "/content") and (request.verb = "POST")</Condition>
</Flow>
然后创建一个带有CONTENT-READ和CONTENT-WRITE范围的产品,如下所示:
现在,您可以创建仅包含CONTENT-READ的第二个产品,将某些应用限制为只读,也可以使用以下范围生成access_token:
<OAuthV2 name="GenerateAccessTokenClient">
<Operation>GenerateAccessToken</Operation>
<ExpiresIn>3600000</ExpiresIn>
<SupportedGrantTypes>
<GrantType>client_credentials</GrantType>
</SupportedGrantTypes>
<GrantType>request.formparam.grant_type</GrantType>
<Scope>request.formparam.scope</Scope>
<GenerateResponse/>
</OAuthV2>
使用两种产品可能更容易强制执行App级别,但是传递范围也会让用户成为3条腿的Oauth添加限制。无论如何,当您生成access_token时,策略将创建一个名为&#34;范围&#34;的Apigee变量。其中包括生成access_token时包含的范围。如果您在生成access_token时未指定范围,则将从scopes变量中包含的产品中获取所有范围,如下所示:
scope: CONTENT-READ CONTENT-WRITE
它只是一个由空格分隔的长字符串。并且似乎没有一种简单的方法将其置于流的条件中,因此我添加了一个RegEx策略来检查允许的范围是否在范围变量中,如下所示:
<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="RegEx-Check-Scope-POST-Content">
<DisplayName>RegEx Check Scope POST-Content</DisplayName>
<FaultRules/>
<Properties/>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>>
<Variable name="scope">
<Pattern>^((?!CONTENT-WRITE).)*$</Pattern>
</Variable>
<Source>request</Source>
</RegularExpressionProtection>
如果CONTENT-WRITE不在作用域字符串中,则正则表达式返回true。如果正则表达式返回true,则会引发错误并停止处理,因此应用程序无法进行POST。
让我知道这是否有意义(它只是几个步骤......)
答案 1 :(得分:0)
在API代理页面(不是“产品”页面)上,您可以添加资源。其中,您可以指出您允许的方法(或请求动词)。这与基于请求动词在Flow上使用条件相同。例如,如果您将<Condition>(request.verb = "POST")</Condition>
添加到捆绑包中的API流中,则意味着只有当您的请求谓词为POST时才会执行特定流程。该包的基本路径的所有其他动词将被忽略。
这样,您只允许API捆绑包的特定请求谓词。
答案 2 :(得分:0)
如果您尝试使用API产品对资源+动词进行精细控制,则可以将API代理代码中的变量flow.resource.name
设置为:
"/" + request.verb + "/" + proxy.pathsuffix
这将为您留下/GET/products/1234-567
之类的内容。变量flow.resource.name
是在使用VerifyAPIKey策略时针对为API产品配置的API资源路径进行验证的变量。