腾讯微博开放平台授权教程(一)
看到腾讯微博开放平台论坛里众多开发者问了很多授权问题,官方又没有及时解答(那个论坛真是烂呀,与新浪的差距可见一斑),主要是他的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
下载附件 (26.53 KB)
腾讯微博开放平台授权教程(一)相关推荐
- 腾讯微博开放平台授权教程(1)
看到坛子里众多开发者问了很多授权问题,官方又没有及时解答,主要是他的API文档有些细节不够明确,经过几天的摸索,我将摸索到的经验以图文及代码的形式写出来,希望能抛砖引玉. 一.前言 腾讯微博开放平台授 ...
- 腾讯微博开放平台 android登录界面显示为pc登录界面 解决方案
腾讯微博开放平台的登录授权一直没有官方的sdk,下载的sdk开始正常使用无问题,但是某天,我们用htc g10 android2.3(有刷过机)使用腾讯微博账号登录,发现登录界面显示为pc上的授权页 ...
- 【49.Auth2.0认证与授权过程-微博开放平台认证授权过程-百度开放平台认证授权过程-社交登录实现(微博授权)-分布式Session问题与解决方案-SpringSession整合-Redis】
一.知识回顾 [0.三高商城系统的专题专栏都帮你整理好了,请点击这里!] [1-系统架构演进过程] [2-微服务系统架构需求] [3-高性能.高并发.高可用的三高商城系统项目介绍] [4-Linux云 ...
- 微博开放平台SDK 移动端的H5方式授权过程分析
最近公司要做一个sdk,仿照微博开放平台.要写移动sdk,并且采用H5页面进行授权.看了几天微博SDK源码,终于理解了微博如何做到通过H5页面授权,并回调移动端的方法返回授权码,access Toke ...
- 使用HttpClient登录微博开放平台,获取授权code
最近需要使用微博开放平台的一些功能,由于官方sdk略坑,故决定自己写个HttpClient来模拟获取授权code.不多说,直接上代码. 首先配置微博开放平台基本参数. private static S ...
- java Oauth2微博开放平台登录授权接入
--前期准备 微博开放平台登录账号,地址:https://open.weibo.com/ 提交身份认证(个人真实姓名.身份证号.身份证照片)审核需要3天左右 注册应用 填写应用名(选择网页应用) 注册 ...
- 新浪与腾讯的开放平台对比
做了金庸问答分别在腾讯和新浪的开放平台上线,了解了一些WEB开发的皮毛,对腾讯和新浪两个开放平台也有了一些认识,下面就我能力范围内对两个平台进行一番比对. 首先说云服务的平台,注意,说的不是开放平台. ...
- 腾讯Q+开放平台,相信又是一次成功的模仿
今天看到两则新闻,中国国内两家互联网大佬都在推自己的开放平台: 腾讯CTO谈Q+开放平台:7月上线. 和 360推360°开放平台:建10亿元创新基金 .从文章的内容来看,Q+的本质就是做一个应用商店 ...
- 新浪与腾讯的开放平台对比(下)
应用审核速度:腾讯完胜.在我前面写的菜鸟从零开始的第一个应用上线记中就写过了,我先提交新浪审核,然后才开始往腾讯移植,结果腾讯这边我三次审核后都上线了新浪的审核居然还没下来,工作效率差的不是一点.在新 ...
- Sina微博开放平台获得App key和App secret
最近由于需要调用微博开放接口,花点时间研究.刚上手,希望与大家多多交流,共同进步.也希望大家多提提意见和建议,感谢. Sina 微博开放平台的 地址是 http://open.t.sina.com.c ...
最新文章
- linux过滤脚本中的字段,Shell脚本中常用的文本过滤命令
- Windows上编译github源码方式运行Node-RED,以及离线迁移安装Node-RED
- Outlook2013修改数据文件默认存放目录
- 【第3篇】python爬虫实战-CSDN个人主页文章列表获取
- docker $PWD路径_Docker 数据持久化
- pd4ml_您应该在本周(7月4日)阅读有趣的AI / ML文章
- 2020软考高级系统分析师,你想知道的全在这
- 计算机科学导论内容大纲,《计算机科学导论》大纲
- 锋利的 jQuery 学习笔记
- 电脑开机出现press f11 to start recovery system问题分析与解决
- CentOS 8使用 Kickstart配置 UEFI PXE 启动
- 褚霸 - Erlang开发实践
- boj 1348 网络流,从来没有一个网络流能让我如此泪流满面,这样的建图方式,仰慕dalong
- iOS“远程越狱”间谍软件Pegasus技术分析
- 在苹果做了十年公关,我总结了这五条建议
- 机器学习项目汇总,值得收藏!
- 与安装应用签名不同怎么解决_手动签名安装掉证书应用、多开任意应用教程
- C++OpenCV实现抠除(也可用于更换)证件照背景
- Zabbix基于Dell系统管理OMSA监控物理服务器硬件
- cocos creator jsc 逆向解码为js