新浪微博开放平台OAuth授权解决方案(含代码)
前几日一位朋友项目中需要使用新浪微博的接口,故和这位朋友一同研究了新浪微博开放平台上面所提供的资料,首先要使用这些接口是需要用户登录并且授权的,新浪微博开放平台其实是提供两种授权方式的,第一种是:OAuth授权方式,第二种是:HTTP普通鉴权方式,我们使用了第一种方式来授权,但是在执行过程中遇到了许多问题,觉得单对新浪微博开放平台还是有一些代表性,所以共享下经验,下面可以下载我的Demo。
OAuth是一种国际授权方式,它不需要用户在第三方应用输入用户名及密码,所以安全性很高,那么在新浪微博开放平台中通过OAuth授权的流程图是这样的:
其实在程序中步骤表现就只有4步:
1、获取Request token。
2、用户认证。
3、获取Access token。
4、获取用户信息。
在处理OAuth授权过程中我也碰到几个在新浪开放平台论坛中常见的几个问题,在这里总结下,在后面讲解中会讲到我的想法和解决办法:
1、requesttoken时callback问题。
2、401错误。
3、403错误。
4、500错误。
5、未经授权错误。
在这里顺便讲一下调用新浪微博接口必须是要申请一个应用的,申请应用成功之后会得到一个App key号和App Secret号,我们也需要通过这两个参数来请求授权,还有就是网上有OAuthBase下载,但是要下对版本,我的Demo中也有,我们的授权主要的代码是在OAuthBase.cs文件中的。
1、获取Request token:
直接上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public void getRequestToken() { Uri uri = new Uri(requestTokenUri); string nonce = oAuth.GenerateNonce(); //获取随机生成的字符串,防止攻击 string timeStamp = oAuth.GenerateTimeStamp(); //发起请求的时间戳 string normalizeUrl, normalizedRequestParameters; // 签名 string sig = oAuth.GenerateSignature(uri, apiKey, apiKeySecret, string .Empty, string .Empty, "GET" , timeStamp, nonce, string .Empty, out normalizeUrl, out normalizedRequestParameters); sig = HttpUtility.UrlEncode(sig); //构造请求Request Token的url StringBuilder sb = new StringBuilder(uri.ToString()); sb.AppendFormat( "?oauth_consumer_key={0}&" , apiKey); sb.AppendFormat( "oauth_nonce={0}&" , nonce); sb.AppendFormat( "oauth_signature={0}&" , sig); sb.AppendFormat( "oauth_signature_method={0}&" , "HMAC-SHA1" ); sb.AppendFormat( "oauth_timestamp={0}&" , timeStamp); sb.AppendFormat( "oauth_version={0}" , "1.0" ); //请求Request Token HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString()); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); string responseBody = stream.ReadToEnd(); stream.Close(); response.Close(); int intOTS = responseBody.IndexOf( "oauth_token=" ); int intOTSS = responseBody.IndexOf( "&oauth_token_secret=" ); Session[ "oauth_token" ] = responseBody.Substring(intOTS + 12, intOTSS - (intOTS + 12)); Session[ "oauth_token_secret" ] = responseBody.Substring((intOTSS + 20), responseBody.Length - (intOTSS + 20)); Response.Redirect(AUTHORIZE + "?oauth_token=" + Session[ "oauth_token" ] + "&oauth_callback=" + Request.Url); } |
我在请求Request token的时候遇到了401错误和地址返回错误,地址返回错误比较好解决,一般都是地址错误,所以我直接用了Request.Url,那么401错误了我出错是在签名 的地方,最开始的OAuthBase文件下载错了,下给最新的就可以了,还有就是在请求参数中的oauth_version参数,有很多值是1.0a,这样好像是不行的,全部改成1.0就能避免很多错误。
2、用户认证:
在Request token请求成功之后,平台自动跳到登录页面,进行用户认证,认证通过之后平台会将oauth_token和oauth_verifier返回到指定的callback来,将两个参数保存下来用于请求Access token,在这里如果地址不正确是会报错的。
3、获取Access token:
这个请求的重点还是在签名,必须要将用户认证后返回的oauth_token和oauth_verifier一并签名才能正确,有些OAuthBase中是没有将verifier加入签名当中当时让我好生郁闷,如果这点错了应该会报未经授权或者403错误,请求成功之后需要将oauth_token和oauth_token_secret重新保存下,下面是代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
public void getAccessToken( string requestToken, string oauth_verifier) { Uri uri = new Uri(ACCESS_TOKEN); string nonce = oAuth.GenerateNonce(); string timeStamp = oAuth.GenerateTimeStamp(); string normalizeUrl, normalizedRequestParameters; // 签名 string sig = oAuth.GenerateSignature( uri, apiKey, apiKeySecret, requestToken, Session[ "oauth_token_secret" ].ToString(), "Get" , timeStamp, nonce, oauth_verifier, out normalizeUrl, out normalizedRequestParameters); sig = oAuth.UrlEncode(sig); //构造请求Access Token的url StringBuilder sb = new StringBuilder(uri.ToString()); sb.AppendFormat( "?oauth_consumer_key={0}&" , apiKey); sb.AppendFormat( "oauth_nonce={0}&" , nonce); sb.AppendFormat( "oauth_timestamp={0}&" , timeStamp); sb.AppendFormat( "oauth_signature_method={0}&" , "HMAC-SHA1" ); sb.AppendFormat( "oauth_version={0}&" , "1.0" ); sb.AppendFormat( "oauth_signature={0}&" , sig); sb.AppendFormat( "oauth_token={0}&" , requestToken); sb.AppendFormat( "oauth_verifier={0}" , oauth_verifier); //请求Access Token HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString()); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); string responseBody = stream.ReadToEnd(); stream.Close(); response.Close(); int intOTS = responseBody.IndexOf( "oauth_token=" ); int intOTSS = responseBody.IndexOf( "&oauth_token_secret=" ); int intUser = responseBody.IndexOf( "&user_id=" ); Session[ "oauth_token" ] = responseBody.Substring(intOTS + 12, intOTSS - (intOTS + 12)); Session[ "oauth_token_secret" ] = responseBody.Substring((intOTSS + 20), intUser - (intOTSS + 20)); Session[ "User_Id" ] = responseBody.Substring((intUser + 9), responseBody.Length - (intUser + 9)); verify_credentials(); } |
4、获取登录用户信息:
步骤简单和以上几个请求方式也一样,主要是要将oauth_token和oauth_token_secret加入签名,下面是代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public void verify_credentials() { string nonce = oAuth.GenerateNonce(); string timeStamp = oAuth.GenerateTimeStamp(); string normalizeUrl, normalizedRequestParameters; // 签名 string sig = oAuth.GenerateSignature( uri, apiKey, apiKeySecret, Session[ "oauth_token" ].ToString(), Session[ "oauth_token_secret" ].ToString(), "Get" , timeStamp, nonce, string .Empty, out normalizeUrl, out normalizedRequestParameters); sig = HttpUtility.UrlEncode(sig); StringBuilder sb = new StringBuilder(uri.ToString()); sb.AppendFormat( "?oauth_consumer_key={0}&" , apiKey); sb.AppendFormat( "oauth_nonce={0}&" , nonce); sb.AppendFormat( "oauth_timestamp={0}&" , timeStamp); sb.AppendFormat( "oauth_signature_method={0}&" , "HMAC-SHA1" ); sb.AppendFormat( "oauth_version={0}&" , "1.0" ); sb.AppendFormat( "oauth_signature={0}&" , sig); sb.AppendFormat( "oauth_token={0}&" , Session[ "oauth_token" ].ToString()); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString()); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); string responseBody = stream.ReadToEnd(); stream.Close(); response.Close(); Session[ "responseBody" ] = responseBody; } |
到这里你可以获取用户的个人信息,那么OAuth授权也就成功,其实步骤是比较简单的,主要要注意的就是签名,签名不正确一定是通过不了的,还有就是一些细节,如地址,版本号,请求方式这些细心点就能避免,由于时间原因这里讲的比较简单,希望大家互相交流下,这里是Demo:SinaOAuth
QQ互联,参考网站:http://www.dandanxiaoshuo.com/
关注下面的微信公众账号进行测试: 扫描一下
新浪微博开放平台OAuth授权解决方案(含代码)的更多相关文章
- iOS5.0以上使用新浪微博开放平台OAuth 续(及解决登录无效问题)
新浪微博开放平台为第三方应用提供了简便的合作模式,满足了手机用户和平板电脑用户随时随地分享信息的需求.通过调用平台的api即可实现很多微博上的功能. 本篇主要目的是记录新浪微博移动SDK iOS版本的 ...
- Oauth2认证以及新浪微博开放平台应用
一.OAuth2.0概述 大部分API的访问如发表微博.获取私信,关注都需要用户身份,目前新浪微博开放平台用户身份鉴权有OAuth2.0和Basic Auth(仅用于应用所属开发者调试接口),新版接口 ...
- 新浪微博开放平台开发-android客户端(1)【转】
http://www.cnblogs.com/virusswb/archive/2011/08/05/2128941.html 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学 ...
- iOS 新浪微博-4.0 OAuth授权
申请开发者 想要拉到到新浪微博的数据,首先让自己成为开发者.申请成为开发者账号很简单,只要有新浪微博的账号即可. 申请地址:http://open.weibo.com/ 在开发的过程中,我们需要拿到几 ...
- DevStore开发人员服务有奖征文:小谈新浪微博开放平台
DevStore开发人员服务有奖征文:小谈新浪微博开放平台 笔者接入新浪微博开发平台也有一段时间了,对整个平台的接入也算比較熟悉,新浪提供了统一的API接口,能够让开发人员更方便的使用API来实现自己 ...
- IOS基于新浪微博开放平台微博APP
1.基于新浪微博开放平台APP源码 2.gitHub源代码下载地址 https://github.com/whzhaochao/SinaWeiBoOpen 3.用到的第三放开源库 3.1 RTLab ...
- apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析
一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...
- 新浪微博开放平台之OAuth2.0认证
1.先到开放平台创建一个移动应用.获得key和secret,接着到"应用信息"里面填写授权回调页的网址,该网址能够随意,可是必须是能訪问的. 2.通过新浪提供的api:https: ...
- 新浪微博开放平台账号申请(基于dcloud开发)
注意事项: 1.新浪微博不仅需要appkey和appsecret,而且还需要回调的url,这个链接是可以随便写的,但是需要和在开放平台申请的一致. 2. Android签名包信息部分 (1.)首先安卓 ...
随机推荐
- Spring集成MyBatis
本文原创,原文地址为http://www.cnblogs.com/fengzheng/p/5045105.html 如果觉得Hibernate不够灵活,可以尝试用Mybatis.相比于Hibernat ...
- 【C#进阶系列】22 CLR寄宿和AppDomain
关于寄宿和AppDomain 微软开发CLR时,将它实现成包含在一个DLL中的COM服务器. 任何Windows应用程序都能寄宿(容纳)CLR.(简单来讲,就是CLR在一个DLL中,通过引用这个DLL ...
- sublime text3的配置(整理)
一.代码片段 开发人员很多时候是在做一些重复的工作. 针对不同数据表的增删改查都差不多,重复来重去的.很久不写程序了,利用十一假期在家看看书,写写程序. 最近一直很喜欢使用Sublime Text,发 ...
- swift-计算器(斯坦福公开课)
看了斯坦福老头的课,真心觉得,我的中文怎么也变的这么垃圾了.是关于iOS8的课程,用swift写的,一个计算器应用的制作,看看人家的课,再看看咱们学校的课(不过垃圾学校,纯粹觉得大学浪费了),废话啊, ...
- JavaEE Tutorials (14) - 用实体图创建获取计划
14.1实体图基础185 14.1.1默认实体图186 14.1.2在持久化操作中使用实体图18614.2使用命名实体图187 14.2.1对实体类应用命名实体图注解187 14.2.2从命名实体图获 ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- 让Delphi XE2程序支持UAC
在win7下,开发的程序有的时候莫名其妙就不能正常工作了,其实都是因为权限不够,要想能够正常运行,就需要获得管理员权限,这就需要处理UAC.具体方法如下: 一,制作“uac.manifest”文件.新 ...
- python方法的延迟加载
数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将是一个很耗时耗资源的操纵,那么有没有办法将计算后的结果缓存起 ...
- FFmpeg的HEVC解码器源代码简单分析:概述
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- Java笔记(day1~day6)
绪论: Java版本区别:J2EE (企业版) J2SE(标准版) J2ME(小型版) Java特性:跨平台 JVM.JRE.JDK介绍 ...