V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanzeyi
V2EX  ›  OAuth

腾讯微博的OAuth问题......

  •  
  •   fanzeyi · 2011-07-27 13:43:54 +08:00 · 12294 次点击
    这是一个创建于 4649 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直是 「Invalid signature」 错误.. 【用的 oauth 库 http://oauth.googlecode.com/svn/code/python/oauth/oauth.py

    然后我就逐行的检查 HMAC 加密的代码.. 发现没有一点问题..

    在 腾讯微博开放平台的论坛上也看到有好多人出现这个问题 似乎是和 urlencode 有关 但是具体的也没人给出个正确的解法...

    在 Github 上有个 andelf/pyqqweibo 的 repo 我直接给他的 oauth.py 改过来用了 但是还是一样不行..

    下面的是 Signature Base String..

    GET&https%3A%2F%2Fopen.t.qq.com%2Fcgi-bin%2Frequest_token&oauth_callback%3Dnull%26oauth_consumer_key%3D11dca692584b4cc2835151b3c925ed1d%26oauth_nonce%3D93468450%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1311745309%26oauth_version%3D1.0

    密匙部分我记得带 & 号了... 有搞过 腾讯OAuth的嘛 求教!
    29 条回复    1970-01-01 08:00:00 +08:00
    joyqi
        1
    joyqi  
       2011-07-27 14:08:36 +08:00
    我调试过这个接口
    open.t.qq.com的接口极为不稳定,可能有10次调用只有一次调用返回正常,其它的都是401,不知道为什么
    所以很可能不是你程序的问题
    joyqi
        2
    joyqi  
       2011-07-27 14:14:05 +08:00
    哦,你的是Invalid signature错误,那你肯定是带了format=json之类的参数了,但是你在算signature的时候没有把这个参数放进去,一般oauth库都有专门接口可以增加额外参数的
    fanzeyi
        3
    fanzeyi  
    OP
       2011-07-27 14:28:28 +08:00
    @joyqi 没带的 除了文档上要求的参数其他什么都没带的。。
    zhouyang
        4
    zhouyang  
       2011-07-27 14:46:34 +08:00
    这个basestring应该没啥问题,可以看到返还的ret和errcode吗?
    fanzeyi
        5
    fanzeyi  
    OP
       2011-07-27 14:54:18 +08:00
    @zhouyang 返回的Content是

    'Invalid signature\n'

    错误代码是401
    joyqi
        6
    joyqi  
       2011-07-27 14:55:48 +08:00
    你把oauth_callback带上值吧,别搞null了。
    fanzeyi
        7
    fanzeyi  
    OP
       2011-07-27 15:01:51 +08:00
    @joyqi 改成网址之后问题依旧囧》。
    zhouyang
        8
    zhouyang  
       2011-07-27 15:05:59 +08:00
    检查一下签名的算法吧
    ayanamist
        9
    ayanamist  
       2011-07-27 15:09:40 +08:00
    很简单,你把OAuth的结果作为HTTP Header传过去的,这是不行的,你要编码到URL中……
    ayanamist
        10
    ayanamist  
       2011-07-27 15:10:08 +08:00
    要记得不要再作为Header了,否则一样会无效的。URL或者Header只能选一个
    fanzeyi
        11
    fanzeyi  
    OP
       2011-07-27 15:18:34 +08:00
    @ayanamist 是URL传输的.. 如果是 Header传输出现的是 Missing **** 的错误...
    fanzeyi
        12
    fanzeyi  
    OP
       2011-07-27 15:20:59 +08:00
    @zhouyang 算法的话 在新浪和饭否的 OAuth 里面都用的是同一个库.. 应该不会有这个问题的..
    joyqi
        13
    joyqi  
       2011-07-27 17:30:47 +08:00
    我觉得就是url编码的问题,腾讯不知道用的一套什么诡异的规则
    fanzeyi
        14
    fanzeyi  
    OP
       2011-07-27 17:49:46 +08:00
    @joyqi 是啊 但是不知道应该怎么来encode..
    zhouyang
        15
    zhouyang  
       2011-07-27 17:56:14 +08:00
    还有encode方法?不是准备好了字典直接urlencode就可以了,字典直接里的值直接encode('utf8')
    joyqi
        16
    joyqi  
       2011-07-27 17:59:51 +08:00
    http://segmentfault.com/user/login

    这里的成功率大概1/5左右,我用的是pecl的oauth库,不知道腾讯在搞什么鬼,其它的应用都妥妥的
    fanzeyi
        17
    fanzeyi  
    OP
       2011-07-27 19:23:49 +08:00
    @joyqi 关键我是一次都不成功...
    fanzeyi
        18
    fanzeyi  
    OP
       2011-07-27 19:24:15 +08:00
    @zhouyang 不是urlencode问题... 是不知道该在哪里转义哪里不转义... 囧死..
    yudun1989
        19
    yudun1989  
       2011-07-27 19:27:39 +08:00
    兄弟可以来找我 [email protected]
    我刚做了。
    fanzeyi
        20
    fanzeyi  
    OP
       2011-07-27 20:07:55 +08:00
    **** 结贴 ****

    解决办法:

    经 @yudun1989 同学提醒.. 把默认用的 httplib 换成 urllib ... 问题解决... 真奇怪的解决方法...
    joyqi
        21
    joyqi  
       2011-08-02 10:50:57 +08:00
    @fanzeyi php也有了解决办法,经过哥的多方猜测,是nonce的编码问题,如果有特殊字符腾讯那边是要求编码,但php没有编码,所以你得自己手动setNonce
    waitd
        22
    waitd  
       2011-11-28 00:25:34 +08:00
    md,我用的是js的OAuth,结果非要把整个请求encodeURIComponent一下,才不会提示invalid signature,但返回的status=0,继续杯具中..狗日的腾讯
    fanzeyi
        23
    fanzeyi  
    OP
       2011-11-28 00:52:28 +08:00
    @waitd 淡定 做OAuth的时候最需要耐心..
    fanzeyi
        24
    fanzeyi  
    OP
       2011-11-28 00:52:37 +08:00
    @waitd 对了还有细心
    laiwei
        25
    laiwei  
       2012-02-23 10:42:01 +08:00
    @fanzeyi 腾讯太变态了,我用httplib2,一直提示invalid signature,换成urllib,确实好了,我擦
    laiwei
        26
    laiwei  
       2012-02-23 11:10:57 +08:00
    @fanzeyi @joyqi

    我发现腾讯微博oauth签名的真正问题了
    并不是urllib或者httplib的问题

    而是计算basestring的计算方法有问题:

    比如待签名的东西参数有:
    d = {
    oauth_callback : xxxx.com/sth
    oauth_consumer_key : 123456
    oauth_nonce : 33333
    oauth_signature_method : HMAC-SHA1
    oauth_timestamp : 1234455667777
    oauth_version : 1.0

    }

    首先把d按照key做一下sort
    d = sorted(d.items(), key=lambda x:x[0])

    其次,把参数和参数的值都做urlencode
    dd = [urllib.urlencode([x]) for x in d]

    然后,把dd用&符号连接起来,再做一次urlencode(也就是quote)
    part3 = urllib.quote("&".join(dd))


    这里的关键就是说,这些参数前前后后,被quote了两次!

    这样做,就ok了
    fanzeyi
        27
    fanzeyi  
    OP
       2012-02-23 12:42:49 +08:00
    @laiwei 谢谢原理解释!
    foxling
        28
    foxling  
       2012-02-25 13:49:00 +08:00
    确认不要有多余的参数,腾讯的request token, 如果有不是他提供的参数列表里的参数时,会出这个问题,同样的oauth库在新浪没有任何问题。
    bollwang
        29
    bollwang  
       2013-12-26 21:11:07 +08:00
    这个是怎么解决的呢?代码能共享一份麽?qq56770498,万分感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   972 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:28 · PVG 04:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.