2014-01-14 39 views
1

我想在驗證apikey時在apigee邊緣引發錯誤。這是做到這一點的正確方法嗎?在Apigee中引發自定義錯誤

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<GetOAuthV1Info enabled="true" continueOnError="false" async="false" name="ValidateAPIKey"> 
    <DisplayName>Validate API Key Policy</DisplayName> 

    <FaultRules> 
     <FaultRule> 
     <Description>InvalidApiKey</Description> 
     <Condition>(flow.param.apikey)=NULL</Condition> 
     </FaultRule> 

    </FaultRules> 

    <Properties/> 
    <AppKey ref="flow.param.apikey"/> 
</GetOAuthV1Info> 
+0

您應該使用['VerifyApiKey'(HTTP://apigee。com/docs/api-services/content/enforce-access-control-using-verifyapikey)策略來驗證API密鑰,而不是那個'GetOAuthV1Info'的東西。 – Cheeso

回答

0

你的故障規則是這樣的

<FaultRule> 
    <Name>InvalidApiKey</Description> 
    <Condition>(fault.name = oauth.v2.InvalidApiKey)</Condition> 
</FaultRule> 

名稱元素引用了一個政策,通常是AssignMessage政策,創建錯誤條件的響應消息。

Condition元素定義將觸發策略的條件。每個策略定義一個錯誤代碼列表,您可以將其用作fault.name變量。

你可以閱讀更多關於故障處理在這裏:

http://apigee.com/docs/api-services/content/fault-handling

+0

我不確定我做錯了什麼,在我的政策中,如果apikey爲空,我希望解僱這項政策。即使我沒有將API密鑰添加到param,它仍然不會執行此故障。 – user1801279

2

如果密鑰爲空或未通過,則VerifyApiKey策略(或GetOAuthV1Info策略)本身將引發錯誤。沒有必要明確地呼叫RaiseFault

典型VerifyApiKey用法是這樣的:

<VerifyAPIKey enabled='true' name='VerifyKey-1'> 
    <DisplayName>Verify API Key</DisplayName> 
    <APIKey ref='request.queryparam.apikey'></APIKey> 
</VerifyAPIKey> 

如果你想要做一個apikey存在先發制人的檢查,運行策略之前,那麼你可以添加這樣的流程一步

<Request> 
    <Step> 
    <Condition>(request.queryparam.key=null) or (request.queryparam.key=EMPTY)</Condition> 
    <Name>RaiseFault-key_not_found</Name> 
    </Step> 
    <Step> 
    <Name>VerifyKey-1</Name> 
    </Step> 
</Request> 

RaiseFault-key_not_foundRaiseFault政策,如下圖所示:

<RaiseFault name="RaiseFault-key_not_found"> 
    <FaultResponse> 
    <Set> 
     <Payload contentType="application/xml"> 
     <consumer> 
      <error> 
      <message>Key doesn't Exists</message> 
      </error> 
     </consumer> 
     </Payload> 
    </Set> 
    </FaultResponse> 
</RaiseFault> 

當然,如果您願意,有效載荷可以是JSON或明文或其他內容。

+0

這種工作對我來說...除了我想在RaiseFault政策上使用動態內容[這裏](http://apigee.com/ docs/api-services/content/exception-handling-raisefault)無論何時我使用{}表示法插入來自apigee變量(如{response.status.code})的動態內容,我都會得到HTTP 500錯誤。如果我不使用它們的工作方式如上所述 –

+0

我的答案顯示在流程中使用故障策略,如果要使用文檔中的示例,請將故障策略放置在流程中,因爲它使用響應變量。 – Srikanth

+0

我在驗證API密鑰策略上使用RaiseFault策略,該策略在RequestFlow中 –

1

我認爲處理故障的政策現在已經有所改變了。但是在政策模式或Apigee docs

中沒有得到正確反映。定義策略/步驟定義中的故障規則現在不起作用。 您必須將故障規則定義爲預流或後流等流程,並在其中包含故障定義。如下圖所示..

<ProxyEndpoint name="default"> 
<Description/> 
<FaultRules> 
<FaultRule name="InvalidApiKeyXml"> 
<Condition>fault.name == &quot;InvalidApiKey&quot;</Condition> 
<Step> 
<Name>invalidAccessForXML</Name> <!-- step to call on fault could be a raise fault or assignmessage policy --> 
</Step> 
</FaultRule> 
</FaultRules> 
... 
</Flows> 
... 
</ProxyEndpoint> 
喜歡你的使用策略中

而不是: 驗證API密鑰策略

<FaultRules> 
    <FaultRule> 
    <Description>InvalidApiKey</Description> 
    <Condition>(flow.param.apikey)=NULL</Condition> 
    </FaultRule> 

</FaultRules> 

<Properties/> 
<AppKey ref="flow.param.apikey"/>