【发布时间】:2017-02-27 03:40:29
【问题描述】:
我很难确定需要对我的 CloudFront 设置执行哪些操作才能使我的签名 cookie 设置正常工作。我已经仔细按照步骤操作并使用带有 NodeJS 的模块来处理 cookie 生成 (https://github.com/jasonsims/aws-cloudfront-sign)。使用我当前的设置,我的应用程序正在为位于beta.my-site.com 的应用程序设置 cookie,但当我的应用程序上的链接访问云端分发 (files.my-site.com) 后面的文件时,它们都不会出现在请求和响应 cookie 中。这令人沮丧,因为我觉得我已经查看了所有内容,但对于我的设置可能无法正常工作的原因只有一些线索。
1) 首先突出的是没有为 cookie 设置域名,这可能是一个问题,因为只要域保持不变,cookie 就应该能够在子域中持续存在。
2) 有没有办法从curl 测试我的 cookie,以确保它与我设置的 cookie 无关?不幸的是,由于 cloudfront 的严格性以及 cookie 需要与 cloudfront 分发配置具有相同的主机名,无法从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
在我的应用程序中设置的 Cookie (beta.my-site.com):
访问文件时设置的 Cookies (files.my-site.com):
当前代码设置:
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');
}
【问题讨论】:
-
我想我让你挂在prior question 上,没有其他人来。您可能应该删除其中之一。如果不了解有关您的设置的更多信息,很难提出正确/理想的解决方案,但一个可能可行的解决方案是将整个应用程序(服务器和资产)置于 单个 CloudFront 分布之后:2 个来源(文件和应用程序)和 2 个(或更多)缓存行为,通过路径路由到适当的目标,访问应用程序路径不需要 cookie。然后它“正常工作”。有用吗?
-
@Michael-sqlbot 我同意我应该删除其中一个问题,并感谢您再次回答。我不确定我是否遵循这一点,因为原始文件引用 s3 存储桶而不是域名。加两个有什么用?我更新了我的问题以包含我的云端原始设置的屏幕截图。
-
您可以将您的应用服务器 (server-beta.elasticbeanstalk.com) 作为附加源(自定义源)添加到分发中,然后您可以路由特定路径通过 CloudFront 通过创建具有特定路径模式的新缓存行为到您的服务器......这样,这些请求位于“文件”域上,服务器可以直接在响应中设置 cookie......所以 files.example。 com/app/*(例如)通过 CloudFront 到达您的应用服务器,而 files.example.com/* 上的所有其他内容都通过 CloudFront 到达 S3。
-
...使用多个来源(存储桶和服务器)通过单个 CloudFront 分配运行整个应用程序(动态和静态内容)可显着简化事情。
-
@Michael-sqlbot 感谢您的帮助,最大的问题是我在设置云端 cookie 时没有设置
domain属性,所以我无法将它们传递给子域
标签: node.js amazon-web-services cookies amazon-cloudfront