2017-03-20 92 views
2

是否有可能在'Custom Authorizer' lambda函數中將請求的源IP地址獲取到API網關?API網關自定義授權者 - 獲取源IP地址

這與您的API Gateway to a lambda function的實際整合絕對是可能的。儘管似乎無法在自定義授權者功能中獲取請求者的IP地址。

我的目標是直接在APIG中進行基於速率的阻塞。 A similar solution is described here。但是,由於我只限制訪問一個或兩個APIG端點,所以我寧願在自定義授權者函數中執行此操作,該操作只是在達到速率限制時將源地址添加到APIG的拒絕策略中。

編輯:澄清一些潛在的困惑。我明白,我可以通過上述定期整合,並在this other post。但我試圖利用自定義授權者功能,這樣我就不必在所有的lambda函數中編寫相同的速率限制代碼。

+1

*「一個自定義的授權者函數,當它達到速率限制時,它簡單地將源地址添加到APIG的拒絕策略。」*看起來有問題。策略沒有鎖定機制,因此,如果給定多個併發的過多用戶,則(執行策略,修改策略,保存策略)可能會使您處於這樣一種狀態,即您「添加」到策略的每個內容也會刪除同時添加的其他內容。在一個無國界的世界中,你如何重視確定限速的必要性? –

+0

計數保存在帶有request_id,source_ip和TTL列的DDB表中。然後,Custom Authorizer檢查給定source_ip的條目數量和大於當前時間的TTL。 TTL類似於當前時間加上10秒。鎖定是我沒有考慮過哪一個問題。無論如何,我最終可能會使用CloudFront和WAF。 – unclemeat

+0

我想我可以在DDB表中添加一個鎖定鍵來訪問策略。 – unclemeat

回答

-1

自定義授權者現在可以使用所謂的Enhanced Context。 您應該可以使用appropriate context variable來獲取該信息(例如$context.identity.sourceIp)。 您可能也能夠使用API​​映射,但我沒有測試過。

+0

context.identity對象實際上只是一個CognitoIdentity對象。其中沒有屬性'sourceIp'。我假設你從[這篇文章]得到這些信息(http://stackoverflow.com/questions/33062097/how-can-i-retrieve-a-users-public-ip-address-via-amazon-api-gateway- λ-N)。這就是說要創建一個API映射來將源IP傳遞給Lambda。 API映射不能用於自定義授權者函數中。默認情況下,該變量在上下文對象中不可用,正如您所建議的那樣。 – unclemeat

+1

閱讀了關於增強型上下文的鏈接後,它似乎實際上是將授權人的附加信息返回給APIG。 APIG上下文對象不會傳遞給您的lambda函數。他們是兩件不同的事情。 – unclemeat

+0

在我的第一個評論中,我討論了python上下文對象。 – unclemeat

-1

你可以得到源IP以及任何代理服務器的IP在

events['headers']['X-Forwarded-For'] 
+0

不,不要那樣做。你不能相信那個頭。任何人都可以將其添加到他們的請求並將任何值放入。我測試了我的發明價值,並出現在日誌中。 –

0

你應該看看

event.requestContext.identity.sourceIp 

它將包含原來的客戶端IP。

當「同一性來源」部分上創建認證器添加

Context: identity.sourceIp 

和啓用高速緩存(默認爲300秒)。 這樣你的授權者lambda將不會被每個請求調用,因爲它會緩存該IP的返回策略。

如果您添加傳遞事件參數的日誌記錄(只是不要忘記緩存,而不是所有對API網關的調用都會激發授權者lambda),您可以嘗試一下自己。

順便說一句,不要使用「X-Forwarded-For」查看我對另一個@ binshi答案的評論。