腾讯微博的OAuth问题...... - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanzeyi
V2EX    OAuth

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

  •  
  •   fanzeyi 2011 年 7 月 27 日 13322 次点击
    这是一个创建于 5281 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直是 「Invalid signature」 错误.. 【用的 oauth 库 http://oauth.googlecode.com/svn/code/python/oauth/oauth.py

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

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

    在 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 年 7 月 27 日
    我调试过这个接口
    open.t.qq.com的接口极为不稳定,可能有10次调用只有一次调用返回正常,其它的都是401,不知道为什么
    所以很可能不是你程序的问题
    joyqi
        2
    joyqi  
       2011 年 7 月 27 日
    哦,你的是Invalid signature错误,那你肯定是带了format=json之类的参数了,但是你在算signature的时候没有把这个参数放进去,一般oauth库都有专门接口可以增加额外参数的
    fanzeyi
        3
    fanzeyi  
    OP
       2011 年 7 月 27 日
    @joyqi 没带的 除了文档上要求的参数其他什么都没带的。。
    zhouyang
        4
    zhouyang  
       2011 年 7 月 27 日
    这个basestring应该没啥问题,可以看到返还的ret和errcode吗?
    fanzeyi
        5
    fanzeyi  
    OP
       2011 年 7 月 27 日
    @zhouyang 返回的Content是

    'Invalid signature\n'

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

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

    解决办法:

    经 @yudun1989 同学提醒.. 把默认用的 httplib 换成 urllib ... 问题解决... 真奇怪的解决方法...
    joyqi
        21
    joyqi  
       2011 年 8 月 2 日
    @fanzeyi php也有了解决办法,经过哥的多方猜测,是nonce的编码问题,如果有特殊字符腾讯那边是要求编码,但php没有编码,所以你得自己手动setNonce
    waitd
        22
    waitd  
       2011 年 11 月 28 日
    md,我用的是js的OAuth,结果非要把整个请求encodeURIComponent一下,才不会提示invalid signature,但返回的status=0,继续杯具中..狗日的腾讯
    fanzeyi
        23
    fanzeyi  
    OP
       2011 年 11 月 28 日
    @waitd 淡定 做OAuth的时候最需要耐心..
    fanzeyi
        24
    fanzeyi  
    OP
       2011 年 11 月 28 日
    @waitd 对了还有细心
    laiwei
        25
    laiwei  
       2012 年 2 月 23 日
    @fanzeyi 腾讯太变态了,我用httplib2,一直提示invalid signature,换成urllib,确实好了,我擦
    laiwei
        26
    laiwei  
       2012 年 2 月 23 日
    @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 年 2 月 23 日
    @laiwei 谢谢原理解释!
    foxling
        28
    foxling  
       2012 年 2 月 25 日
    确认不要有多余的参数,腾讯的request token, 如果有不是他提供的参数列表里的参数时,会出这个问题,同样的oauth库在新浪没有任何问题。
    bollwang
        29
    bollwang  
       2013 年 12 月 26 日
    这个是怎么解决的呢?代码能共享一份麽?qq56770498,万分感谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2251 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:22 PVG 09:22 LAX 17:22 JFK 20:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86