2017-06-16 20 views
0

新鮮善待這樣的:通行證用戶代理和客戶端的ip lambda表達式

我有一個試圖做一個查找對與客戶/用戶IP地址的數據庫,一個非常簡單的lambda函數。我沒有從客戶端傳遞IP地址,但希望從API網關調用的請求標頭中獲取它。

對於資源的POST方法,我繪製這些HTTP請求頭:

  • HTTP_CLIENT_IP(不知道這是否是足夠了)
  • User_Agent類

我有一個身體,映射模板用於集成請求的「application/json」:

{ "source_ip" : "$context.identity.sourceIp", "user_agent" : "$context.identity.userAgent" }

從AWS API網關控制檯測試POST方法時,我將HTTP_CLIENT_IP設置爲有效的專用地址,並將User-Agent設置爲「測試」。這是我的結果:

從郵遞員我的結果是:

{\"isBase64Encoded\":false,\"statusCode\":200,\"headers\": {\」 訪問控制 - 允許 - 原產地\ 「:\」 * \」 },\"body\": {\ 「BADIP \」:假的,\ 「ipIsNull \」:true,\「ip \」:null }}「

來自AWS控制檯的結果並不是真正值得關注的問題,但PostMan的結果是!

任何幫助將不勝感激,謝謝。

下面是一個非常小的lambda函數:

"use strict"; 

console.log('Loading function'); 
exports.handler = (event, context, callback) => `{ 
    var loc = getGeoLocByIP(event.source_ip, event.user_agent, context); 
    callback(null, JSON.stringify(loc)); 
`}; 

function getGeoLocByIP(clientIp, userAgent, event) `{ 
    var maxmind = require('maxmind'); 
    if (maxmind.validate(clientIp)) `{ 
     var fs = require('fs'); 
     var dbLoc = 'data/GeoLite2-City.mmdb'; 

     if (fs.existsSync(dbLoc)) `{ 
      var cityLookup = maxmind.openSync(dbLoc); 
      var lkupres = cityLookup.get(clientIp); 
      cityName = lkupres.city.names.en; 
      var response = `{ 
       "isBase64Encoded": false, 
       "statusCode": 200, 
       "headers": `{ 
       "Access-Control - Allow - Origin": "*" 
       `}, 
       "body": `{ 
       "cityName": cityName, 
       "client_ip": clientIP, 
       "user_agent": userAgent 
       `} 
      `}; 
      return response; 
     `} else `{ 
     console.warn('db file does not exist: ' + dbLoc); 
     `} 
    `} else `{ 
     if (clientIp != null) `{ 
      var response = `{ 
      "isBase64Encoded": false, 
      "statusCode": 200, 
      "headers": `{ 
       "Access-Control - Allow - Origin": "*" 
      `}, 
      "body": `{ 
       "badIP": true, 
       "ipIsNull": false, 
       "ip": clientIp 
      `} 
     `}; 
    `} else `{ 
     var response = `{ 
      "isBase64Encoded": false, 
      "statusCode": 200, 
      "headers": `{ 
       "Access-Control - Allow - Origin": "*" 
      `}, 
      "body": `{ 
       "badIP": false, 
       "ipIsNull": true, 
       "ip" : null 
      `} 
     `}; 
    `} 
    return response; 
`} 

`} }

回答

0

有很多反引號周圍的括號({})在你的代碼可能會或可能不會是問題的原因。反引號在JavaScript中爲template literals

假設你的函數語法正確,你應該在收到您的lambda函數的source_ipuser_agent爲您的映射表達式是正確的。

檢查您的Lambda函數的日誌輸出以及可能導致識別問題。

此外,只是單挑。您將context變量從您的處理程序傳遞到getGeoLocByIp,並將其稱爲event。這可能會導致混淆。雖然,你沒有在任何地方引用event-context,所以你可以刪除它。

+0

反引號是我嘗試提供格式良好的降價,失敗。至於事件和背景,我在兩者之間來回交換,看看我是否能夠發現價值在哪裏。我將刪除它。謝謝你的提示。 – kgjac