`
jljxj
  • 浏览: 5890 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

腾讯微博开放平台授权教程(1)

 
阅读更多

看到坛子里众多开发者问了很多授权问题,官方又没有及时解答,主要是他的API文档有些细节不够明确,经过几天的摸索,我将摸索到的经验以图文及代码的形式写出来,希望能抛砖引玉。
一、前言
  腾讯微博开放平台授权目前采用的是Oauth1.0,关于Oauth1.0的授权流程,见腾讯微博开放平台官方说明,
地址http://wiki.open.t.qq.com/index.php/OAuth%E6%8E%88%E6%9D%83%E8%AF%B4%E6%98%8E
Oauth1.0的官方OAuth官网地址:http://www.oauth.net/

Oauth1.0的授权过程比较繁琐,最新的的授权方式是Oauth2,OAuth官方也有淘汰Oauth1.0的意思,腾讯目前也应该在升级,在API接口上已经全面支持Oauth2,但在授权阶段还是先要通过Oauth1.0,拿1.0的oauth_token来换2.0的oauth_token,注意,腾讯官方对oauth_token 和access_token在说法上有时候指一个东西,有时候又不是,注意分辨。在1.0中,request_token(未授权的token)经用户授权后就是oauth_token,再拿oauth_token去换access_token,在2.0的概念, oauth_token应是未授权的token,而access_token则是授权过的token。
说说Oauth1.0授权的过程,分三大步
1.发起一个授权请求,腾讯根据你的appkey,给你一个临时牌照,也就是request_token,这一步通常不用显示出来。
2.用户输入在腾讯的账户密码登录腾讯,并授权的你的应用可以访问他的账户,你就获得了oauth_token和一个验证码,注意这里的oauth_token和上一步的request_token值是一样的,就是临时牌照换成了正式牌照
3.你拿oauth_token和验证码再去换access_token,正式牌照换成了通行证。
注意,腾讯官方的写法
Snap1.jpg


第2点,个人觉得改为oauth_token比较好
说Oauth1.0繁琐,其中重要的一点是每次都要计算一个签名signature,这东西的原理就是将你请求网页的方式、网址、网址的参数、时间等加密,计算出一个值,提交的网址中再带上这个值,服务器端读出你提交的网址参数(去掉signature本身),它也来算一遍,看跟你提交的signature是否一致,不一致就是invalid了,有效防止了篡改参数,坛子里很多人都卡这里了。本文稍后详解。
为了规范本文的语法概念,先定义一些概念及参数,入门语言VB6,可以放到ini文件里,如

[腾讯微博]
baseUrl=http://open.t.qq.com/api/{0}’腾讯API的基地址
request_tokenUrl=https://open.t.qq.com/cgi-bin/request_token’请求未授权token地址
authorizeUrl=https://open.t.qq.com/cgi-bin/authorize’用户输入用户名和密码的授权地址
tokenUrl=https://open.t.qq.com/cgi-bin/access_token’换取access_token地址
redirect_uri=null’回调地址callbackurl
App_Key = *****’应用KEY
App_Secret = ******’应用密码
oauth_token=******’用户授权的token
oauth_token_secret=******’用户授权的token密码
access_Token=******’1.0最终的通行证了
access_token_secret=******’1.0最终的通行证密码
accesstoken2_0=******’2.0最终的通行证
refreshtoken2_0=******’2.0最终的通行证密码
expiretime2_0=******’2.0最终的通行证过期时间

 二、腾讯oauth1.0授权的实现
这里,我尽量使用简洁的逻辑和代码实现上面所说的oauth1.0授权步骤,注意我这里采用桌面应用, oauth_callback=null
1.获取未授权的Request_Token。
我们来看看如何获得request_token,先来看看官方的说明

http://wiki.open.t.qq.com/index.php/OAuth%E6%8E%88%E6%9D%83/%E8%8E%B7%E5%8F%96request_token
请求说明
url  https://open.t.qq.com/cgi-bin/request_token 
格式  xml,json 
http请求方式  get 
是否需要鉴权  true 
请求数限制  true 

参数说明
请求参数:oauth或openid&openkey标准参数,并带上以下参数
format  返回数据的格式是(json或xml) 
oauth_callback  回调URL 如果是桌面应用或手机应用没有回调URL,采用pin码方式,请填上 oauth_callback=null 
oauth_consumer_key  你申请的appkey 
oauth_nonce  随机串(32个字符长度)随机生成,只能使一次,与时间戳一起 防重放 
oauth_signature  oauth请求签名 oauth请求的签名,根据oauth协议中算法生成basestring 后,用appsecret 对basestring 经hmac_sha1生成的签名串 
oauth_signature_method  签名方法(HMAC-SHA1) 
oauth_timestamp  时间戳 你的请求当前时间戳 (你的服务器时间你定要准确,不然请求会被拒绝掉) 
oauth_version  oauth版本号(填1.0) 

使用说明
https://open.t.qq.com/cgi-bin/request_token?oauth_callback=http%3A%2F%2Fqunmgr.qq.com%2Foauthapi%2Fcallback.php&oauth_consumer_key=0aae7ba5c10d4b939694b0b3b9ffe8ac&oauth_nonce=b788149731e0ed75daa03a6e1e30427c&oauth_signature=zO5%2FgT%2FP6tbhBBZVuoyfjPwjdxY%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1288932298&oauth_version=1.0

返回结果
oauth_token=a63f4a0e1242462fb8c11e53159ba294&oauth_token_secret=40ece707e064128e4fec692e3c09c692&oauth_callback_confirmed=true

返回结果说明
oauth_token:返回的request_token
oauth_token_secret:返回的request_secret
oauth_callback_confirmed:回调确认

官方说得很明确,就是要构造一个网址,然后get,获得结果,注意,这个结果并不是官方所说标准的json数据(json一般以{}[]和逗号分隔)!

这一步并不需要让用户知道,也是说这步在用户输入用户名和密码之前实现,为了演示方便,我这里添加了一个获取access_token按钮,用VB代码实现
添加一个Form1,一个获取requestToken的按钮,以及一个用于返回结果的文本框text1
添加一些变量定义

Dim baseUrl As String
Dim request_tokenUrl As String
Dim authorizeUrl As String
Dim tokenUrl As String
Dim App_Key As String
Dim App_Secret As String
Dim redirect_uri As String
Dim oauth_token As String
Dim oauth_token_secret As String
Dim oauth_verifier As String
Dim access_token As String
Dim access_token_secret As String
Dim accesstoken2_0 As String 'oauth2
Dim refreshtoken2_0 As String
Dim expiretime2_0 As String
    
Dim objtqq As New clsTQQ ‘定义类了

Private Sub Form_Load() '程序期待读取初始值
appProfileName = App.Path & "/setting.ini"'加载ini文件 
baseUrl = GetIniS("腾讯微博", "baseUrl", "") '读ini值的函数不再给出,网上到处都是
request_tokenUrl = GetIniS("腾讯微博", "request_tokenUrl", "")
authorizeUrl = GetIniS("腾讯微博", "authorizeUrl", "")
tokenUrl = GetIniS("腾讯微博", "tokenUrl", "")
App_Key = GetIniS("腾讯微博", "App_Key", "")
App_Secret = GetIniS("腾讯微博", "App_Secret", "")
redirect_uri = GetIniS("腾讯微博", "redirect_uri", "")
With objtqq
    .c_baseUrl = baseUrl
    .c_request_tokenUrl = request_tokenUrl
    .c_authorizeUrl = authorizeUrl
    .c_tokenUrl = tokenUrl
    .c_App_Key = App_Key
    .c_App_Secret = App_Secret
    .c_redirect_uri = redirect_uri
…..
End With
End Sub

Private Sub Cmd_GetRequest_token_Click()
Text1.Text = objtqq.Get_oauth_token '这里演示获得返回request_token
End Sub

我们来看看clsTQQ类,
'Class clsTQQ
    Public c_baseUrl As String
    Public c_request_tokenUrl As String
    Public c_authorizeUrl As String
    Public c_tokenUrl As String
    Public c_App_Key As String
    Public c_App_Secret As String
    Public c_redirect_uri As String
    Public c_oauth_token As String '未授权token
    Public c_oauth_token_secret As String
    Public c_oauth_verifier As String
    Public c_access_token As String '授权后的token
    Public c_access_token_secret As String
    Public c_accesstoken2_0 As String 'oauth2
    Public c_refreshtoken2_0 As String
    Public c_expiretime2_0 As String
Public Function Get_oauth_token()
        Dim codeUrl As String, baseString As String, paraUrl As String
        Dim codeUrlTempalte As String 
        Dim paraUrlTempalte As String
        Dim baseStringTemplate As String
        Dim tempstr As String
            codeUrlTempalte = "{0}?oauth_callback={3}&oauth_consumer_key={1}&oauth_nonce={2}&oauth_signature={5}&oauth_signature_method=HMAC-SHA1&oauth_timestamp={4}&oauth_version=1.0"
        paraUrlTempalte = "oauth_callback={3}&oauth_consumer_key={1}&oauth_nonce={2}&oauth_signature_method=HMAC-SHA1&oauth_timestamp={4}&oauth_version=1.0"’注意了,参与计算signature的参数,排列顺序必须按字母排序
        baseStringTemplate = "{method}&{encode_request_tokenUrl}&{encode_paraUrl}" '用于生成signature,由三部分组成{method}是GET 或POST 两个值中的一个,要大写。
        
        oauth_nonce = makePassword(10) '随机数,官方说是32位,其实多少位都可以
        oauth_timestamp = DateDiff("s", "01/01/1970 08:00:00", Now()) '邮戳
        
        paraUrl = Replace(paraUrlTempalte, "{1}", Me.c_App_Key) '参数串
        paraUrl = Replace(paraUrl, "{2}", oauth_nonce)
        paraUrl = Replace(paraUrl, "{3}", Me.c_redirect_uri)
        paraUrl = Replace(paraUrl, "{4}", oauth_timestamp)
        
        baseString = Replace(baseStringTemplate, "{method}", "GET")
        baseString = Replace(baseString, "{encode_request_tokenUrl}", strUrlEnCode(Me.c_request_tokenUrl))
        baseString = Replace(baseString, "{encode_paraUrl}", strUrlEnCode(paraUrl))
        
'        Debug.Print baseString
        oauth_signature = HAMC_SHA1(Me.c_App_Secret + "&"+me.c_oauth_token_secret, baseString)’计算signature了,HAMC_SHA1的key官方说法有两部分组成App_Secret 和oauth_token_secret,中间用&分隔,这一步还没产生oauth_token_secret,因此值是空的
'对于HAMC_SHA1算法,这里采用调用一段javascript代码的方式获得,不再赘述
     codeUrl = Replace(codeUrlTempalte, "{0}", Me.c_request_tokenUrl)
        codeUrl = Replace(codeUrl, "{1}", Me.c_App_Key)
        codeUrl = Replace(codeUrl, "{2}", oauth_nonce)
        codeUrl = Replace(codeUrl, "{3}", Me.c_redirect_uri)
        codeUrl = Replace(codeUrl, "{4}", oauth_timestamp)
        codeUrl = Replace(codeUrl, "{5}", oauth_signature)
        
        tempstr = httpGet(codeUrl)
        Me.c_oauth_token = 解析tempstr'这里代码没有给出
        Me.c_oauth_token_secret =解析tempstr'这里代码没有给出
        Get_oauth_token = tempstr
      
    End Function
'随机串
Function makePassword(ByVal maxLen)
    Dim strNewPass
    Dim whatsNext, upper, lower, intCounter
    Randomize
    For intCounter = 1 To maxLen
    whatsNext = Int((1 - 0 + 1) * Rnd + 0)
    If whatsNext = 0 Then
    upper = 122
    lower = 100
    Else
    upper = 57
    lower = 48
    End If
    strNewPass = strNewPass & Chr(Int((upper - lower + 1) * Rnd + lower))
    Next
    makePassword = strNewPass
End Function
‘计算signature时网址及参数特殊符号编码
Function strUrlEnCode(ByVal strUrl)
strUrlEnCode = Replace(strUrl, "=", "%3D")
strUrlEnCode = Replace(strUrlEnCode, "&", "%26")
strUrlEnCode = Replace(strUrlEnCode, ":", "%3A")
strUrlEnCode = Replace(strUrlEnCode, "/", "%2F")
End Function

 

 

 

分享到:
评论

相关推荐

    Android腾讯微博开放平台入门源代码

    Android腾讯微博开放平台入门源代码,包括: 1、basestring 2、signature 3、base64encoder 4、oauth授权 5、发布一条文字微博 6、简单的测试界面

    【第三方开放平台系列】腾讯微博Oauth2.0授权认证-源码

    【第三方开放平台系列】腾讯微博Oauth2.0授权认证-源码

    腾讯微博 iWeibo v2.0 SP1.zip

    iWeibo系统是基于腾讯微博开放平台API开发的一套免费微博系统,拥有腾讯微博的全部功能,且为各垂直领域做专业化的组件设计与开发;同时与腾讯微博平台互通,开发者可获得海量的腾讯用户与信息资源,并在此版本基础...

    腾讯微博API SDK vb 源码

    这是腾讯微博开放平台API SDK vb版 1.0.0 本SDK采用腾讯目前oauth1.0的授权机制,换取2.0token,API功能接口利用了oauth2,更为简洁。 实现的功能: 1.oauth1.0授权及2.0授权 2.实现了腾讯开放平台上列举出的所有...

    腾讯微博源代码 php技术制作 下载学习吧

    产品介绍:iWeibo系统是基于腾讯微博开放平台API开发的一套免费微博系统,广大开发者和站长可下载安装文件部署到自己的服务器上,为网站提供微博服务,也可以在此系统基础上进行更丰富的功能开发。 版本最新特性1...

    Android 腾讯微博客户端源码.zip

    这个微博客户端中用到得一些知识点。...15:腾讯Oauth认证的使用(新浪的,人人的,淘宝的开放API也是基于这个的,版本不同可能) 16:ViewHolder以及LayoutInflater等的使用 17:腾讯API的调用与封装  

    腾讯iWeibo免费微博系统 v1.0.zip

    iWeibo免费微博系统基于腾讯微博开放平台API开发的免费微博系统iWeibo,该微博系统针对开发者与站长,并与腾讯微博帐号对接,用户信息/收听关系同步,官方称利用iWeibo,第三方网站可以搭建一个完整的微博系统 ...

    手机版微博 毕业设计 毕业论文 代码清单 答辩PPT 英文翻译

    通过腾讯的腾讯微博开放平台来开发属于自己的腾讯微博软件,具有很大的开发意义。 本次研究设计并实现了一个基于android平台下的手机腾讯微博系统,具有界面简洁,信息分享快速化等的特点,通过腾讯互动平台的API...

    iWeibo v1.0

    iWeibo免费微博系统基于腾讯微博开放平台API开发的免费微博系统iWeibo,该微博系统针对开发者与站长,并与腾讯微博帐号对接,用户信息/收听关系同步,官方称利用iWeibo,第三方网站可以搭建一个完整的微博系统产品...

    iOS新浪微博、腾讯微博分享功能实例

    首先分别从新浪微博开放平台(http://open.weibo.com/)、腾讯微博开放平台(http://dev.t.qq.com/)中注册应用,获取到Appkey,AppSecret和AppURL(其中 AppURL是要自己填写的)。 然后分别下载相关的SDK. ...

    Asp.Net 腾讯QQ授权登录,新浪微博授权登录,OAuth2

    Asp.Net QQ开放平台登录代码,新浪微博开放平台登录代码,OAuth2,腾讯QQ授权登录,新浪微博授权登录,完全源代码,无任何外部dll支持,简单易懂,适合学习及开发应用!

    tx微博分享文档

    为了使用腾讯微博分享应用,开发者需要申请 AppKey 和 AppSecret,这可以在腾讯微博开放平台官方网站上完成。AppKey 和 AppSecret 是用于身份验证和授权的重要信息,需要妥善保管。 3. SDK 使用方法 文档提供了...

    JustAuth-史上最全的整合第三方登录的工具,目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软和今日头条等第三方平台的授权登录。 Login, so easy!.zip

    目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软和今日头条等第三方平台的授权登录。 Login, so easy!JustAuth...

    OAutho 2.0 授权框架

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储...2.0版本的OAuth还处于draft阶段,但是有很多公司已经采用了,比如:google, facebook, linkin等,国内比如:新浪微博,腾讯微博。

    小I聊天机器人C#接入源代码。初次使用ibot聊天机器人,新手立即使用。可为微信公众平台等等其他平台提供聊天机制。

    小I聊天机器人接入代码,直接可用(高级授权模式,智能问答)。 新手立即使用。 iBot Cloud:全称为“小i机器人智能云服务平台...并支持多种渠道(微信、腾讯微博、新浪微博、iPhone SDK 、Android SDK)的快速接入。

    ThinkPHP开发类库扩展

    目前可用登录平台为:腾讯QQ,腾讯微博,新浪微博,网易微博,人人网,360,豆瓣,Github,Google,MSN,点点,百度,开心网,搜狐。 3,包含的文件 ThinkSDK/ThinkOauth.class.php SDK基类,主要用于Oauth的认证,...

    iWeibo 2.0 SP1

    iWeibo系统是基于腾讯微博开放平台API开发的一套免费微博系统,拥有腾讯微博的全部功能,且为各垂直领域做专业化的组件设计与开发;同时与腾讯微博平台互通,开发者可获得海量的腾讯用户与信息资源,并在此版本基础...

    Android开发:微信授权登录与微信分享完全解析

    于是第三方社交帐号登陆成为了许多新兴应用的选择,由于腾讯官方微信开放平台的在线文档相对最新的SDK有些出入,并且登录相关的文档结构次序有些紊乱,今天就把我的一些经验记录在此,对微信开放平台官方的在线文档...

    OYKX个人网站博客程序 v1.8

    新增腾讯,新浪微博与说说,日志同步功能 新增音乐在线试听的功能 新增首页图片展示最大化功能 完成官方论坛,地址:www.psdzj.com 更新相册显示方式,启用了最大化功能 更新博客防注册机的功能 修复重复提交BUG ...

Global site tag (gtag.js) - Google Analytics