Cloudfront Lambda @edgeはビューアリクエストでCookieを設定します

4
Randy Hall 2019-03-12 18:41.

更新:私の考えをよりよく収集しました

Viewer Request Lambdaでユーザーごとに一意の識別子(UUID)を生成し、そのUUIDに基づいて返すキャッシュページを選択しています。これは機能します。

理想的には、このユーザーは常に同じUUIDを持っています。

そのビューアリクエストのCookieに存在しない場合は、ビューアリクエストでそのUUIDを生成する必要があります。また、UUIDをCookieとして設定する必要があります。これはもちろん、要求ではなく応答で発生します。

キャッシュを使用せずに、サーバーはカスタムヘッダーを取得し、応答ヘッダーにSet-Cookieを作成するだけです。

ページをキャッシュしたい場合、これを処理する方法が見つかりません。キャッシュのリクエストヘッダーを無視して、正しいキャッシュページを提供できますが、次のリクエストで使用されるCookieが設定されていないため、ユーザーはそのUUIDを保持しません。

誰かがこのようなことを成し遂げましたか?

私が試していること

私がこれに取り組んでいるいくつかの角度がありますが、まだ仕事に取り掛かることができていません:

  1. Cloudfrontの2番目のラムダで使用される可能性のあるViewerRequestからViewerResponseへのヘッダーまたはその他のデータパススルーを処理するCloudfrontのある種の設定。

  2. ビューアリクエストの応答オブジェクトヘッダーをプリエンプティブに変更します。私が見逃している組み込みのCloudfront方法論がない限り、ヘッダーはまだ作成されていないため、これは不可能だと思います。

  3. ある種の既存のパススルーヘッダーですが、要求と応答の処理のこの側面に精通していないため、それが問題であるかどうかはわかりませんが、一見の価値があります。

  4. おそらく(まだ試していませんが)クライアントリクエストラムダで応答オブジェクト全体を作成し、そこからキャッシュされたページを提供し、応答ヘッダーを変更してからコールバックメソッドに渡すことができます。

トービンの答えは実際には機能しますが、固溶体ではありません。ユーザーがCookieを保存または提供していない場合、それは無限ループになります。さらに、回避できる場合は、すべてのページの前にリダイレクトをスローしたくありません。


やや機能するコンセプト

  1. ビューアリクエストラムダは、UUIDがCookieに存在しない場合、UUIDを生成します
  2. Viewer Request Lambdaは、リクエストオブジェクトのヘッダーのCookieにUUIDを設定します。更新されたリクエストオブジェクトが渡されたコールバック
  3. UUIDCookieバストの存在Cloudfrontキャッシュ
  4. Origin Request Lambdaは、UUIDが存在する場合にトリガーされます
  5. Origin Request Lambdaはhttp.get、UUID cookieセットを使用して元のリクエストURLを再度呼び出します(40KBの制限により、Viewer Request Lambdaでこれを行うのは実用的ではありません)
  6. Viewer Request Lambdaの2番目のシナリオでは、UUIDが存在することを確認し、UUID cookieを削除してから、通常どおり要求を続行します
  7. まだキャッシュされていない場合は2番目のオリジンリクエスト-キャッシュされている場合はキャッシュされた応答、キャッシュバスティングUUIDが存在しないため-実際のページのHTMLを最初のオリジンリクエストに返します
  8. 最初のオリジンリクエストは、http.getHTMLを含むことから応答を受け取ります
  9. First Origin Requestはhttp.get、元のUUIDで設定されたSet-Cookieヘッダーからの応答本文を含むカスタム応答オブジェクトを作成します

UUIDがすでに設定されている後続の呼び出しでは、CookieからUUIDが削除され(キャッシュの無効化を防ぐため)、Viewer Request Lambdaの2番目のシナリオに直接スキップされ、キャッシュされたバージョンのページが直接読み込まれます。

エンドポイントに到達しようとすると、バイナリファイルがダウンロードされるため、「やや」と言います。

編集

これは、content-typeヘッダーを設定していなかったためです。現在、302リダイレクトの問題しかありません...これを克服した場合は、完全な回答を投稿します。


元の質問

ビューアーリクエストにオプションを選択し、キャッシュまたはサーバーから取得する前にリクエストにいくつかの設定を行う関数があります。

それは機能しますが、将来のユーザーのためにその選択を覚えておいてほしいです。考えは、ユーザーが次にアクセスしたときに読み取ることができるCookieを設定することです。これはViewerRequestにあり、Viewer Responseにはないので、それを実現する方法、またはLambda自体を介して可能かどうかさえわかりません。

Viewer Request -> 
  Lambda picks options (needs to set cookie) -> 
    gets corresponding content -> 
      returns to Viewer with set-cookie header intact

私がしている例を見やラムダ経由ビューア応答で正常にクッキーを設定することができました。リクエストに応じて決定を下す必要があるので、それは私にはあまり役に立ちません。当然のことながら、このコードをViewer Requestに追加しても、応答には何も表示されません。

3 answers

5
Michael - sqlbot 2019-03-31 05:03.

存在しないCookieを設定する本当に正しい方法はSet-Cookie、と同じURIへの302リダイレクトを返し、ブラウザにリクエストをやり直すことだと私は主張します。ブラウザは同じ接続を再利用してリダイレクトを「追跡」できるため、これはおそらく大きな影響はありません。

ただし、そのようにしないことを主張する場合は、Viewer Requestトリガーを使用してCookieをリクエストに挿入し、ViewerResponseトリガーでSet-Cookie同じ値を発行できます。

ビューアの応答イベントのリクエストオブジェクトは、元のリクエストイベントで見つかったのと同じ場所にあります。event.Records[0].cf.request

ビューア応答トリガーでは、構造のこの部分に「CloudFrontがビューアから受信したリクエストであり、ビューアリクエストイベントによってトリガーされたLambda関数によって変更された可能性があります」が含まれます

Cookieヘッダーを正しく処理するように注意してください。Cookieリクエストヘッダは、ブラウザがあるため、慎重かつ正確な操作を必要とする複数のフォーマットを使用することができ、複数のクッキーが存在する場合。

昔々、Cookieは単一のリクエストヘッダーとして送信する必要がありました。

Cookie: foo=bar; buzz=fizz

;後に値を分割してこれらを解析し<space>ます。

ただし、ブラウザは次のように複数のヘッダーでそれらを分割することもあります。

Cookie: foo=bar
Cookie: buzz=fizz

後者の場合、配列event.Records[0].cf.request.headers.cookieには複数のメンバーが含まれます。valueその配列内の各オブジェクトの属性を調べ、それぞれの中に複数の値があるかどうかを確認し、Cookieが存在しない場合に配列が完全に未定義(空ではない)になるという事実に対応する必要があります。


ボーナス:これが私が書いた関数です。Cookieがない場合も含め、すべてのケースを正しく処理できると思います。それはあなたが探している名前でクッキーを抽出します。Cookie名では大文字と小文字が区別されます。

// extract a cookie value from request headers, by cookie name
// const my_cookie_value = extract_cookie(event.Records[0].cf.request.headers,'MYCOOKIENAME');
// returns null if the cookie can't be found
// https://stackoverflow.com/a/55436033/1695906

function extract_cookie(headers, cname) {

    const cookies = headers['cookie'];
    if(!cookies)
    {
        console.log("extract_cookie(): no 'Cookie:' headers in request");
        return null;
    }

    // iterate through each Cookie header in the request, last to first

    for (var n = cookies.length; n--;)
    {
        // examine all values within each header value, last to first

        const cval = cookies[n].value.split(/;\ /);
        const vlen = cval.length;

        for (var m = vlen; m--;)
        {
            const cookie_kv = cval[m].split('=');
            if(cookie_kv[0] === cname)
            {
                return cookie_kv[1];
            }            
        } // for m (each value)    
    } // for n (each header)

    // we have no match if we reach this point
    console.log('extract_cookie(): cookies were found, but the specified cookie is absent');
    return null;

}
1
Tobin 2019-03-13 01:52.

別のディレクトリを追加できますか?最初のcookie setterリクエストで、実際のコンテンツにリダイレクトするcookie-setヘッダーを含むリダイレクトを(ラムダから)返しますか?

OK、長い道のりですが:

  • 着信リクエストからCookie命令を取得します
  • これをどこかに設定します(キャッシュなど)
  • リクエストでオブジェクトを取得しましょう
  • 応答で、(キャッシュ)を読み取り、必要に応じて応答にset-cookieヘッダーを設定する関数も呼び出しますか?
0
jotaelesalinas 2020-10-08 05:01.

質問が公開されてから1年以上が経ちました。あなたが解決策を見つけて、それを私たちと共有できることを願っています!

私は同じ問題に直面していて、無限ループについても考えています...これはどうですか?

  • ビューアリクエストイベントは、Cookieが設定された302応答と、LocationヘッダーのURLに追加されuuid=whatever たGETパラメータなどを返します_uuid_set_=1

  • GETパラメーター_uuid_set_が設定されている(1に等しいが、これは必要ありません)次のビューアー要求では、2つのオプションがあります。

    • Cookieuuidが設定されていない場合は、応答500を返送してループを解除するか、ニーズに合ったものを送信できます。

    • または、Cookieが設定されている場合は、パラメータを_uuid_set_削除して別の302を送り返すため、エンドユーザーには表示されず、コピーして貼り付けて共有することもできず、全員が夜寝ることができます。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language