V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http://www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
maga
V2EX  ›  Tornado

大量用户的时候,同一个客户端请求, tornado cookie 返回了其它用户的 ID

  •  
  •   maga · 2014-12-20 16:32:28 +08:00 · 5398 次点击
    这是一个创建于 3631 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我通过tornado的set_secure_cookie来设置用户ID, 当有许多用户同时访问的时候,get_secure_cookie会返回其它用户的的ID.

    不知道这是不是tornado cookie API 的一个bug?
    20 条回复    2014-12-22 15:57:12 +08:00
    binux
        1
    binux  
       2014-12-20 16:47:21 +08:00
    确认不是缓存的问题吗?你能复现吗?既然你是根据 cookie 判断用户的,你怎么知道返回的是其他用户的ID?
    maga
        2
    maga  
    OP
       2014-12-20 16:52:54 +08:00
    @binux 比如访问/userid, 我在/userid 的handler里打印print userid。 在后台有许多用户同时访问的时候,我同一台手机,访问打印出来的userid不一样。 用户访问少的时候,打印出来是同一个userid.
    maga
        3
    maga  
    OP
       2014-12-20 16:54:52 +08:00
    @binux 因为每个用户的页面是不一样的,我一看就知道返回了其它用户的页面。 还比较容易复现。
    binux
        4
    binux  
       2014-12-20 17:00:48 +08:00
    @maga 既然有许多用户同时访问,你怎么知道打出来的那一条是你的?而且你 print 的时候,多进程吗? flush 了吗?
    你在哪看?你在页面上输出读到的 cookie ,看看和发送的是否一致。
    maga
        5
    maga  
    OP
       2014-12-20 17:09:45 +08:00
    @binux 我单一进程调试的,用户不是很多,我看点击的时机,还是能判断log是我的
    binux
        6
    binux  
       2014-12-20 17:13:28 +08:00
    @maga 你不是说“有许多用户同时访问的时候”,“同一台手机,访问打印出来的”
    maga
        7
    maga  
    OP
       2014-12-20 17:20:42 +08:00
    @binux 因为log只在一个handler里打印,有多个用户的时候,眼睛还是能够看得出来的。 相当于同一个浏览器,访问会打印出不同的userid log
    sujin190
        8
    sujin190  
       2014-12-20 20:17:24 +08:00
    贴个代码看看呗
    maga
        9
    maga  
    OP
       2014-12-20 20:38:00 +08:00
    <code>
    class ShakeOwnerHandler(BaseHandler):
    def get(self, template_vars={}):
    openid = self.get_current_user()
    if openid is None:
    code = self.get_argument('code', default=None)
    if code is None:
    self.redirect(KURL_SHAKEMONEY_MAIN)
    return
    else:
    appid = APPID
    appsecret = APPSECRET
    openid = self.get_oauth_openid(appid, appsecret, code)
    print 'owner handler oauth:' + openid
    self.set_cookie_user(openid)

    print 'openid:' + openid

    .......
    </code>
    maga
        11
    maga  
    OP
       2014-12-20 20:41:41 +08:00
    maga
        12
    maga  
    OP
       2014-12-20 20:44:14 +08:00
    @sujin190 不好意思,贴代码没经验。 就这个handler, 多个用户处理的时候, 对单个浏览器get_secure_cookie返回的openid会变成别人的openid
    chevalier
        13
    chevalier  
       2014-12-20 22:29:31 +08:00
    不会吧。我们这边给客户端的API,一天30亿的PV,千万的注册用户,也没发生过这种情况
    maga
        14
    maga  
    OP
       2014-12-20 22:38:26 +08:00
    @chevalier 我想也不至于有这种bug。。。 被这个问题搞死了
    ccdjh
        15
    ccdjh  
       2014-12-21 12:30:07 +08:00   ❤️ 1
    @livid 这里注入js了

    @maga

    self.get_oauth_openid函数是用来加盐的吧,贴一下,是这里问题么?


    变量名 openid 有问题么?
    Kai
        16
    Kai  
    MOD
       2014-12-21 15:15:30 +08:00
    @maga 可以直接贴 gist 地址 :)
    Livid
        17
    Livid  
    MOD
       2014-12-22 15:32:07 +08:00
    @ccdjh

    1. gist 地址是可以直接显示的

    2. 但是因为 gist 在用 Fastly 加速,而 Fastly 因为同时也给 The Guardian 和 Twitter 提供 CDN 服务而被影响了。
    maga
        18
    maga  
    OP
       2014-12-22 15:52:12 +08:00
    @livd 我打开这页,会一直卡在11楼好久
    maga
        19
    maga  
    OP
       2014-12-22 15:55:59 +08:00
    @Livid 我在国内打开这页,会一直卡在11楼好久
    Livid
        20
    Livid  
    MOD
       2014-12-22 15:57:12 +08:00
    @maga 你需要让你的浏览器能够直接访问 gist,也就是这个域名:

    gist.github.com
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:38 · PVG 00:38 · LAX 08:38 · JFK 11:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.