新鮮善待這樣的:通行證用戶代理和客戶端的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;
`}
`} }
反引號是我嘗試提供格式良好的降價,失敗。至於事件和背景,我在兩者之間來回交換,看看我是否能夠發現價值在哪裏。我將刪除它。謝謝你的提示。 – kgjac