2016-10-18 66 views
0

我很難確定使用CloudFront設置需要完成哪些操作才能使我的簽名cookie設置正常工作。我仔細地遵循了這些步驟,並使用帶有NodeJS的模塊來處理Cookie生成(https://github.com/jasonsims/aws-cloudfront-sign)。使用我目前的設置,我的應用程序將設置cookie爲beta.my-site.com,但當我的應用程序中的鏈接訪問cloudfront發行版後面的文件(files.my-site.com)時,不會出現在請求cookie和響應cookie中。這是令人沮喪的,因爲我覺得我已經看過一切,只有一些線索,爲什麼我的設置可能無法正常工作。CloudFront調試缺少Cookie值

1)首先突出的是,沒有爲Cookie設置域名,這可能是一個問題,因爲只要域保持不變,cookie就應該能夠通過子域保留。

2)有沒有一種方法可以從curl測試我的Cookie,以確保它不需要處理我設置的cookie?不幸的是,由於cloudfront的嚴格性以及需要cookie與雲端分佈配置具有相同的主機名,因此無法從localhost進行測試。

文件名和密鑰隨機生成,而不是真實的。

的Cloudfront分佈配置:

Distribution Status: Deployed 
Alternate Domain Names (CNAMEs): files.my-site.com, beta.my-site.com, *.my-site.com 
SSL Certification: *.my-site.com (bjdsofjwpefsd4235) 
Domain Name: uhr82459shfngbc.cloudfront.net 
Custom SSL Client Support: SNI 
Origin Domain Name: files-beta.s3.amazonaws.com 
Restrict Bucket Access: Yes 
Your Identities: access-identity-files-beta.s3.amazonaws.com 
Viewer Protocol Policy: HTTPS Only 
Allows HTTP Methods: GET, HEAD 
Restrict Viewer Access: Yes 
Trusted Signers: Self 

路線53:

beta.my-site.com CNAME server-beta.elasticbeanstalk.com 
file.my-site.com A ALIAS uhr82459shfngbc.cloudfront.net 

餅乾在我的應用程序中設置(beta.my-site.com):

012當文件被訪問(files.my-site.com)塊

餅乾設置: enter image description here

當前代碼設置:

var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var crypto = require('crypto'); 
var moment = require('moment'); 
var path = require('path'); 
var fs = require('fs'); 
var cf = require('aws-cloudfront-sign'); 
var metaTags = require('./meta-routes'); 
var cfPK = fs.readFileSync(path.join(__dirname + /config/pk-UHANFBYH54248.pem)); 

var cfOptions = { 
    keypairId: 'E5YGBKNfsdfds472', 
    privateKeyString: cfPK 
} 

var signedCookies = cf.getSignedCookies('https://files.my-site.com/*', cfOptions); 

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) 

     for(var cookieId in signedCookies) { 
      res.cookie(cookieId, signedCookies[cookieId]); 
     } 

     return next(); 
    res.redirect('/login'); 
} 

行爲設置: enter image description here

+0

我想我留給你掛在[先前的問題](http://stackoverflow.com/q/40010849/1695906),沒有人來過。你可能應該刪除其中的一個。如果不瞭解有關設置的更多信息,很難提出正確/理想的解決方案,但可行的方法是將整個應用程序(服務器和資產)置於* CloudFront分發之後:2個來源(文件和應用程序)和2(或更多)緩存行爲,通過路徑路由到適當的目標,不需要訪問應用程序路徑的cookie。然後它「只是有用」。有用嗎? –

+0

@ Michael-sqlbot我同意我應該刪除其中一個問題,並感謝您再次回覆。我不確定我是否按照原始文件引用S3桶而不是域名。什麼會加兩個呢?我更新了我的問題以包含我的原始設置的屏幕截圖。 – cphill

+0

您可以將您的應用服務器(server-beta.elasticbeanstalk.com)作爲附加源(自定義起源)添加到該分配中,然後您可以通過創建新的緩存行爲來將特定路徑*通過* CloudFront路由到您的服務器特定的路徑模式......這樣,這些請求位於「文件」域中,服務器可以直接在響應中設置cookie ...所以files.example.com/app/*(例如)通過* CloudFront到您的應用程序服務器,而files.example.com/*上的所有其他內容則通過CloudFront到S3。 –

回答

0

最大的問題必須做我的Cloudfront的域屬性中的值爲N/A請求Cookies。爲了將cookie從父域傳遞到子域,該屬性需要具有主機名的值。

+1

我面臨同樣的問題。你是如何添加主機名的? – smaira