看到腾讯微博开放平台论坛里众多开发者问了很多授权问题,官方又没有及时解答(那个论坛真是烂呀,与新浪的差距可见一斑),主要是他的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,正式牌照换成了通行证。
注意,腾讯官方的写法
 
第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

我们来看objtqq类中是如何实现Get_oauth_token的, 关键了

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

运行程序,点登录微博,返回了oauth_token等值,解析返回的信息,用于第2步获取oauth_token

前天 23:04 上传

下载附件 (26.53 KB)

腾讯微博开放平台授权教程(一)相关推荐

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

    看到坛子里众多开发者问了很多授权问题,官方又没有及时解答,主要是他的API文档有些细节不够明确,经过几天的摸索,我将摸索到的经验以图文及代码的形式写出来,希望能抛砖引玉. 一.前言 腾讯微博开放平台授 ...

  2. 腾讯微博开放平台 android登录界面显示为pc登录界面 解决方案

    腾讯微博开放平台的登录授权一直没有官方的sdk,下载的sdk开始正常使用无问题,但是某天,我们用htc g10  android2.3(有刷过机)使用腾讯微博账号登录,发现登录界面显示为pc上的授权页 ...

  3. 【49.Auth2.0认证与授权过程-微博开放平台认证授权过程-百度开放平台认证授权过程-社交登录实现(微博授权)-分布式Session问题与解决方案-SpringSession整合-Redis】

    一.知识回顾 [0.三高商城系统的专题专栏都帮你整理好了,请点击这里!] [1-系统架构演进过程] [2-微服务系统架构需求] [3-高性能.高并发.高可用的三高商城系统项目介绍] [4-Linux云 ...

  4. 微博开放平台SDK 移动端的H5方式授权过程分析

    最近公司要做一个sdk,仿照微博开放平台.要写移动sdk,并且采用H5页面进行授权.看了几天微博SDK源码,终于理解了微博如何做到通过H5页面授权,并回调移动端的方法返回授权码,access Toke ...

  5. 使用HttpClient登录微博开放平台,获取授权code

    最近需要使用微博开放平台的一些功能,由于官方sdk略坑,故决定自己写个HttpClient来模拟获取授权code.不多说,直接上代码. 首先配置微博开放平台基本参数. private static S ...

  6. java Oauth2微博开放平台登录授权接入

    --前期准备 微博开放平台登录账号,地址:https://open.weibo.com/ 提交身份认证(个人真实姓名.身份证号.身份证照片)审核需要3天左右 注册应用 填写应用名(选择网页应用) 注册 ...

  7. 新浪与腾讯的开放平台对比

    做了金庸问答分别在腾讯和新浪的开放平台上线,了解了一些WEB开发的皮毛,对腾讯和新浪两个开放平台也有了一些认识,下面就我能力范围内对两个平台进行一番比对. 首先说云服务的平台,注意,说的不是开放平台. ...

  8. 腾讯Q+开放平台,相信又是一次成功的模仿

    今天看到两则新闻,中国国内两家互联网大佬都在推自己的开放平台: 腾讯CTO谈Q+开放平台:7月上线. 和 360推360°开放平台:建10亿元创新基金 .从文章的内容来看,Q+的本质就是做一个应用商店 ...

  9. 新浪与腾讯的开放平台对比(下)

    应用审核速度:腾讯完胜.在我前面写的菜鸟从零开始的第一个应用上线记中就写过了,我先提交新浪审核,然后才开始往腾讯移植,结果腾讯这边我三次审核后都上线了新浪的审核居然还没下来,工作效率差的不是一点.在新 ...

  10. Sina微博开放平台获得App key和App secret

    最近由于需要调用微博开放接口,花点时间研究.刚上手,希望与大家多多交流,共同进步.也希望大家多提提意见和建议,感谢. Sina 微博开放平台的 地址是 http://open.t.sina.com.c ...

最新文章

  1. linux过滤脚本中的字段,Shell脚本中常用的文本过滤命令
  2. Windows上编译github源码方式运行Node-RED,以及离线迁移安装Node-RED
  3. Outlook2013修改数据文件默认存放目录
  4. 【第3篇】python爬虫实战-CSDN个人主页文章列表获取
  5. docker $PWD路径_Docker 数据持久化
  6. pd4ml_您应该在本周(7月4日)阅读有趣的AI / ML文章
  7. 2020软考高级系统分析师,你想知道的全在这
  8. 计算机科学导论内容大纲,《计算机科学导论》大纲
  9. 锋利的 jQuery 学习笔记
  10. 电脑开机出现press f11 to start recovery system问题分析与解决
  11. CentOS 8使用 Kickstart配置 UEFI PXE 启动
  12. 褚霸 - Erlang开发实践
  13. boj 1348 网络流,从来没有一个网络流能让我如此泪流满面,这样的建图方式,仰慕dalong
  14. iOS“远程越狱”间谍软件Pegasus技术分析
  15. 在苹果做了十年公关,我总结了这五条建议
  16. 机器学习项目汇总,值得收藏!
  17. 与安装应用签名不同怎么解决_手动签名安装掉证书应用、多开任意应用教程
  18. C++OpenCV实现抠除(也可用于更换)证件照背景
  19. Zabbix基于Dell系统管理OMSA监控物理服务器硬件
  20. cocos creator jsc 逆向解码为js

热门文章

  1. PHP文件运行步骤及数据库的连接
  2. IDEA打包war部署到Tomcat
  3. 利用Racher轻松构建PASS平台
  4. 图解DbgView使用
  5. STM32F103学习笔记(4)—— 串口通信——发送、接收数据详解
  6. python 实现dcmtk关联pacs功能 推送下拉影像
  7. 解决SecureCRT信号灯超时
  8. mysql数据库左连接
  9. z变换与s变换之间的转换(一些零碎且不严谨的想法)
  10. linux可视化打开root,Linux非root用户登录情况下可视化编辑root权限文本