无法检索龙卷风安全cookie

时间:2016-04-04 00:23:51

标签: python session cookies tornado

由于某种原因,我无法检索我用龙卷风设置的安全cookie。使用firebug我可以看到cookie和它的到期日期,但是当我尝试打印或检索它时,它会一直显示为无。有什么办法让我无效,我看不到。这是我正在使用的代码:

class loginHandler(tornado.web.RequestHandler):
def post(self):
    # first type of request made to this page is a post
    userEmail = self.get_argument("username")
    password = self.get_argument("password")
    deviceType = self.get_argument("deviceType")

    # get some info from the client header
    userIp = self.request.headers['X-Real-Ip']
    userAgentInfo = self.request.headers['User-Agent']

    result = pumpkinsdb.loginUser(userEmail, password, deviceType, userIp, userAgentInfo)
    if result == None:
        self.redirect("/")
    else:
        fullname = pumpkinsdb.pumpkinsdb_user['fullName']
        this_page_title = fullname if fullname else pumpkinsdb.pumpkinsdb_user['userEmail']

        # successful login set up user's cookies
        # self.set_secure_cookie("memberId", str(user['memberId']), expires_days=0.1, secure=True, httponly=True)
        self.set_secure_cookie("memberId", str(pumpkinsdb.pumpkinsdb_user['memberId']))
        self.write(str(self.get_secure_cookie("memberId")))

        time_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        print "{} [{}::get] pid[{}] login requested for user: [{}] from [{}] using [{}]".format(
            time_now, self.__class__.__name__, os.getpid(), pumpkinsdb.pumpkinsdb_user['emailAddress'],
            pumpkinsdb.pumpkinsdb_user['userIp'], pumpkinsdb.pumpkinsdb_user['userAgentInfo'])

        self.render('calendar.html', title = this_page_title)

def get(self):
    validSession = self.get_secure_cookie("memberId")
    if validSession:
        this_page_title = pumpkinsdb.pumpkinsdb_user['fullName']
        self.render('calendar.html', title = this_page_title)
    else:
        print self.get_secure_cookie("memberId")
        self.write(str(validSession))

2 个答案:

答案 0 :(得分:1)

当您重新启动服务器时,您的cookie秘密会以某种方式发生变化吗?如果cookie密钥更改,则所有现有cookie都将失效。请注意,即使cookie秘密应该是随机生成的,但这并不意味着您的代码中应该有cookie_secret=os.urandom(16)之类的东西,因为每次都会生成一个新秘密。相反,您需要调用os.urandom一次并将其输出保存在某处(保持安全和私密,就像您的TLS密钥一样)。

答案 1 :(得分:0)

基本上问题是我在nginx后面运行了四个龙卷风进程,并且对于每个龙卷风进程,我生成了一个唯一的随机字符串:

cookie_secret = base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes)

显然这是我的问题,因为每个龙卷风过程都有不同的秘密所以当我试图读龙卷风时认为它是无效的。

关键是要生成一个唯一的随机字符串,然后将其存储在安全的地方,例如您的选项:

define(cookie_secret, "934893012jer9834jkkx;#$592920231@@##")

或你认为合适的任何字符串。

感谢所有回复的人。抱歉。