Apigee - 如何通过动词限制产品中的资源

时间:2014-06-05 16:41:50

标签: apigee

我希望限制对RESTful API中某些方法的访问。我试图通过简单的产品来实现这一点,允许访问资源/运动员*但我没有看到任何更好的控制方式,即我希望只允许GET请求而不是POST和DELETE。是否存在在产品的自定义资源路径部分中表达此语法的语法,或者我是否需要通过条件流来处理此问题,例如:检查产品名称是否可以访问?

3 个答案:

答案 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 &quot;/content&quot;) and (request.verb = &quot;GET&quot;)</Condition>
    </Flow>
    <Flow name="Content Create">
        <Description/>
        <Request>
            <Step>
                <FaultRules/>
                <Name>RegEx-Check-Scope-POST-Content</Name>
            </Step>
        </Request>
        <Response />
        <Condition>(proxy.pathsuffix MatchesPath &quot;/content&quot;) and (request.verb = &quot;POST&quot;)</Condition>
    </Flow>

然后创建一个带有CONTENT-READ和CONTENT-WRITE范围的产品,如下所示:

enter image description here

现在,您可以创建仅包含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>

使用两种产品可能更容易强制执行A​​pp级别,但是传递范围也会让用户成为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 = &quot;POST&quot;)</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资源路径进行验证的变量。