我使用传输敏感数据的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?或者是否有其他推荐的方法来做到这一点?
答案 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错误。