要求API调用以使用HTTPS与Apigee

时间:2014-12-12 16:29:58

标签: https apigee

我使用传输敏感数据的Apigee构建代理。我需要确保此API的客户端使用HTTPS。

我编写了一个类似这样的提升错误政策

代理/ default.xml中

<PreFlow name="PreFlow">
    <Request>
        <Step>
            <FaultRules/>
            <Name>Require-HTTPS</Name>
            <Condition>request.scheme != "https"</Condition>
        </Step>
    </Request>
    <Response/>
</PreFlow>

政策/需要-HTTPS.xml

<RaiseFault async="false" continueOnError="false" enabled="true" name="Require-HTTPS">
<DisplayName>Require-HTTPS</DisplayName>
<FaultRules/>
<Properties/>
<FaultResponse>
    <Set>
        <Headers/>
        <Payload contentType="application/json">\{ 
"status" : 400,            
"message" : "Sensitive transactions may only be executed over HTTPS",
}
      </Payload>
        <StatusCode>400</StatusCode>
        <ReasonPhrase>Requires HTTPS</ReasonPhrase>
    </Set>
</FaultResponse>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>

问题是,无论我使用HTTP还是HTTPS访问,都会引发错误。 我可以在调试控制台中看到proxies.xml中的条件总是解析为true,无论我使用HTTP还是HTTPS来访问API。实际上,request.scheme似乎总是HTTP。

但是,我确实看到使用HTTPS访问的以下标头使用HTTP

不存在
X-Forwarded-Proto :     https

我是否可以依赖此标头来强制HTTPS仅访问我的API?或者是否有其他推荐的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用virtualhost.name变量(默认或安全)来检测虚拟主机而不是方案。

但是,我建议您创建两个代理 - 一个用于https,一个用于http。这将消除消费者滑过您的条件障碍的可能性。点击&#34;默认&#34;在Proxy下编辑整个代理文件并向下滚动到HTTPProxyConnection

<HTTPProxyConnection>
    <BasePath>/testme</BasePath>
    <VirtualHost>default</VirtualHost>
    <VirtualHost>secure</VirtualHost>
</HTTPProxyConnection>

只需删除VirtualHost默认设置,消费者将无法再使用https进行连接。我相信你可以创建一个具有相同路径的第二个API,然后才删除&#34; secure&#34;并创建一个没有条件的RasieFault。最糟糕的情况是,如果您只是在API中禁用默认值,则可以依赖Apigee错误。