API Gateway FAQ では、API Gatewayに送信されたリクエストヘッダーにアクセスできることがわかります...
既にOAuthトークンまたはその他の認証メカニズムを利用している場合、署名済みAPI呼び出しを必要とせず、検証のためにトークンヘッダーをバックエンドに転送するようにAPI Gatewayを簡単にセットアップできます。
ただし、ドキュメントでその方法の例を見つけることはできません。Lambdaを使用してこのデータにアクセスする方法は不明です。
オープンAPIをセットアップし、POST( ウォークスルー:API GatewayおよびLambda関数 )の一部であるJSONオブジェクトにアクセスできますが、自分のプロバイダーでOAuth 2.0スタイルAPIを実装するには、「Authorization」ヘッダーにアクセスする必要があります。
私の好みは、LambdaとJava 8を使用してこれをセットアップすることですが、node.jsを使用した例は、これを実現する方法を理解するのにも役立ちます。
APIメソッドを説明するダッシュボード画面のIntegration Request
パネル内に入力マッピングを作成する必要があります。
次のコードは、name
クエリ入力パラメーターをLambda Event input object
に変換します。
{
"name": "$input.params('name')"
}
スクリーンショット:
これに関する詳細は、元の AWSフォーラムのLambda入力スレッドへのAPIゲートウェイ で確認できます。
最初に、HTTP GETリクエストからAuthorization
ヘッダーをトラップする必要があります。次に、その値をLambdaイベントオブジェクトにマッピングする必要があります。
APIメソッドダッシュボードに移動し、[メソッドリクエスト]をクリックします。以下に示すように、そこにAuthorization
というHTTP Request Header
を追加できます。
これにより、Authorization
ヘッダーがトラップされるため、後で使用できます。
メソッドダッシュボードに戻り、Integration Request
をクリックします。ここから、このようなマッピングを使用して、ヘッダーの値をLambda関数に渡すことができます。
{
"Authorization": "$input.params('Authorization')"
}
Lambda関数で、このような値を取得できます。
event.Authorization
統合リクエストで次のマッピングテンプレートを使用して、すべてのパス、クエリ、ヘッダーパラメーターをLambdaイベントに一般的にマッピングできます。 API GatewayのMethod Requestセクションでそれらを登録する必要がありますが、使用する特定のパラメーターからマッピングテンプレートを少なくとも分離できます。この方法では、ヘッダー、クエリ、またはパスパラメーターを変更するたびにマッピングテンプレートコードを変更する必要はありません。
マッピングテンプレートの詳細と説明を提供するブログ投稿を書きました。 http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your -lambda-event-from-api-gateway /
使用できるマッピングテンプレートは次のとおりです。
{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
},
"queryParams": {
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
},
"pathParams": {
#foreach($param in $input.params().path.keySet())
"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
#end
}
}
これは古いスレッドですが、目的のためにラムダプロキシ統合を使用するのが最適であることがわかりました。これにより、APIゲートウェイで何も設定する必要がなく、ラムダ関数のすべてのヘッダーを取得できます...
ラムダプロキシ統合リクエストで設定するPrabhatの答えによると、これを行う最も簡単な方法です。その後、リクエストヘッダー、パスパラメーター、クエリパラメーターにアクセスできます。
event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
Kennbrodhagenによる解決策は私にとってはうまくいきました。詳細については彼の答えとブログをご覧ください。ポスターはJava実装の優先順位を表明し、JavaでKennのハンドラーを実装する方法を理解するのに時間がかかったので、対応するJavaコードを共有しています。
public class MyHandler implements RequestHandler<Map<String,Object>,String> {
@Override
public String handleRequest(Map<String,Object> eventMap, Context context) {
LambdaLogger logger = context.getLogger();
logger.log("Body:" + eventMap.get("body"));
logger.log("Headers:" + eventMap.get("headers"));
logger.log("Method:" + eventMap.get("method"));
logger.log("Params:" + eventMap.get("params"));
logger.log("Query:" + eventMap.get("query"));
return("{}");
}
}