2016-07-26 25 views
8

從API網關,我使用Python中的Lambda函數爲我的API創建了一個custom authorizer。 API網關使用我配置的標頭(method.request.header.Authorization)移交傳入的授權令牌。不過,我也需要在我的lambda函數中使用原始http請求的其他頭文件。我如何訪問它們?我沒有看到event對象輸入到我的lambda函數的頭文件。如何訪問定製授權者中的http頭部AWS lambda函數

請注意,這不是How to access HTTP headers for request to AWS API Gateway using Lambda?的重複。問題是關於自定義授權者lambda函數。我沒有看到任何配置選項將傳入的http頭傳遞給授權者lambda函數。

根據AWS Documentation,API網關使用下面的輸入調用Custom Authorizer。基於下面,我假設我的問題是不可能的。但要檢查是否有解決方法。

 

{ 
    "type":"TOKEN", 
    "authorizationToken":"", 
    "methodArn":"arn:aws:execute-api:<regionId>:<accountId>:<apiId>/<stage>/<method>/<resourcePath>" 
} 
+0

不可能。爲什麼你需要多個標題?解決方法:自己在集成的Lambda函數中處理認證/授權。 – hellomichibye

回答

1

不幸的是,目前這是不可能的,但我們計劃增加對此的支持以及對定製授權人的一些其他改進。我目前沒有ETA提供。

+0

是當前處理某種請求身份驗證的最佳方式(如驗證需要來自請求頭,查詢字符串和有效內容的數據的簽名,類似於AWS V4),然後在接收方中實際執行自己的驗證Lambda(或映射到API網關端點的Lambda集)? – Numbat

+2

我需要將此功能添加到Amazon api網關中,因爲在我的使用情況下,我需要訪問http頭以獲取X-API-KEY並與令牌授權人一起驗證。讓我們儘快將你的功能加起來。 –

+2

自這一年以來有任何更新? –

0

接下來,我們非常喜歡這個功能。 只有頭部授權的結果是,我們只能授權所有基於相同邏輯的lambda函數,儘管這不是我們想要的。

作爲一種變通方法,我們已經討論瞭解決方案,包括在標題更多的數據(這不是最優的)

否則總有在lambda函數本身做具體授權的可能性,但在這種情況下, ,我們真的沒有用於定製API網關授權人。

2

這是現在可以通過使用Authoriser類型的「請求」,而不是令牌

全部細節在這裏: http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html

從根本上說,所有的報頭中的事件對象傳遞一個請求授權

即頭對象的事件


    "headers": { 
     "X-wibble": "111", 
     "X-wobble": "222", 
     "x-amzn-ssl-client-hello": "*Deleted*", 
     "Via": "1.1 .cloudfront.net (CloudFront)", 
     "CloudFront-Is-Desktop-Viewer": "true", 
     "CloudFront-Is-SmartTV-Viewer": "false", 
     "CloudFront-Forwarded-Proto": "https", 
     "X-Forwarded-For": "*Deleted*", 
     "CloudFront-Viewer-Country": "GB", 
     "Accept": "*/*", 
     "User-Agent": "curl/7.55.1", 
     "X-Amzn-Trace-Id": "Root=*Deleted*", 
     "Host": "*Deleted*.execute-api.eu-west-1.amazonaws.com", 
     "X-Forwarded-Proto": "https", 
     "X-Amz-Cf-Id": "*Deleted*", 
     "CloudFront-Is-Tablet-Viewer": "false", 
     "X-Forwarded-Port": "443", 
     "CloudFront-Is-Mobile-Viewer": "false" 
    }