Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1472|回复: 0

新浪微博开放平台OAuth授权解决方案(含代码)

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2011-11-5 17:22:20 | 显示全部楼层 |阅读模式
    前几日一位朋友项目中需要使用新浪微博的接口,故和这位朋友一同研究了新浪微博开放平台上面所提供的资料,首先要使用这些接口是需要用户登录并且授权的,新浪微博开放平台其实是提供两种授权方式的,第一种是: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. public void getRequestToken()
    2.    {         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. public void getAccessToken(string requestToken, string oauth_verifier)
    2. 02    { 03        Uri uri = new Uri(ACCESS_TOKEN); 04        string nonce = oAuth.GenerateNonce(); 05        string timeStamp = oAuth.GenerateTimeStamp(); 06        string normalizeUrl, normalizedRequestParameters; 07        // 签名 08        string sig = oAuth.GenerateSignature( 09        uri, 10        apiKey, 11        apiKeySecret, 12        requestToken, 13        Session["oauth_token_secret"].ToString(), 14        "Get", 15        timeStamp, 16        nonce, 17        oauth_verifier, 18        out normalizeUrl, 19        out normalizedRequestParameters); 20        sig = oAuth.UrlEncode(sig); 21        //构造请求Access Token的url 22        StringBuilder sb = new StringBuilder(uri.ToString()); 23        sb.AppendFormat("?oauth_consumer_key={0}&", apiKey); 24        sb.AppendFormat("oauth_nonce={0}&", nonce); 25        sb.AppendFormat("oauth_timestamp={0}&", timeStamp); 26        sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1"); 27        sb.AppendFormat("oauth_version={0}&", "1.0"); 28        sb.AppendFormat("oauth_signature={0}&", sig); 29        sb.AppendFormat("oauth_token={0}&", requestToken); 30        sb.AppendFormat("oauth_verifier={0}", oauth_verifier); 31        //请求Access Token 32        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString()); 33        HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 34        StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); 35        string responseBody = stream.ReadToEnd(); 36        stream.Close(); 37        response.Close(); 38        int intOTS = responseBody.IndexOf("oauth_token="); 39        int intOTSS = responseBody.IndexOf("&oauth_token_secret="); 40        int intUser = responseBody.IndexOf("&user_id="); 41        Session["oauth_token"] = responseBody.Substring(intOTS + 12, intOTSS - (intOTS + 12)); 42        Session["oauth_token_secret"] = responseBody.Substring((intOTSS + 20), intUser - (intOTSS + 20)); 43        Session["User_Id"] = responseBody.Substring((intUser + 9), responseBody.Length - (intUser + 9)); 44        verify_credentials(); 45    }
    复制代码

    4、获取登录用户信息:
      步骤简单和以上几个请求方式也一样,主要是要将oauth_token和oauth_token_secret加入签名,下面是代码:
    1. public void verify_credentials()
    2. 02{ 03    Uri uri = new Uri("http://api.t.sina.com.cn/account/verify_credentials.xml"); 04    string nonce = oAuth.GenerateNonce(); 05    string timeStamp = oAuth.GenerateTimeStamp(); 06    string normalizeUrl, normalizedRequestParameters; 07    // 签名 08    string sig = oAuth.GenerateSignature( 09    uri, 10    apiKey, 11    apiKeySecret, 12    Session["oauth_token"].ToString(), 13    Session["oauth_token_secret"].ToString(), 14    "Get", 15    timeStamp, 16    nonce, 17    string.Empty, 18    out normalizeUrl, 19    out normalizedRequestParameters); 20    sig = HttpUtility.UrlEncode(sig); 21    StringBuilder sb = new StringBuilder(uri.ToString()); 22    sb.AppendFormat("?oauth_consumer_key={0}&", apiKey); 23    sb.AppendFormat("oauth_nonce={0}&", nonce); 24    sb.AppendFormat("oauth_timestamp={0}&", timeStamp); 25    sb.AppendFormat("oauth_signature_method={0}&", "HMAC-SHA1"); 26    sb.AppendFormat("oauth_version={0}&", "1.0"); 27    sb.AppendFormat("oauth_signature={0}&", sig); 28    sb.AppendFormat("oauth_token={0}&", Session["oauth_token"].ToString()); 29    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sb.ToString()); 30    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 31    StreamReader stream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); 32    string responseBody = stream.ReadToEnd(); 33    stream.Close(); 34    response.Close(); 35    Session["responseBody"] = responseBody; 36}
    复制代码

    到这里你可以获取用户的个人信息,那么OAuth授权也就成功,其实步骤是比较简单的,主要要注意的就是签名,签名不正确一定是通过不了的,还有就是一些细节,如地址,版本号,请求方式这些细心点就能避免,由于时间原因这里讲的比较简单,希望大家互相交流下,这里是Demo:SinaOAuthSinaOAuth

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

    该用户从未签到

    发表于 2012-3-6 08:49:14 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-3-6 08:49:23 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-5-8 14:54:50 | 显示全部楼层
    楼主,辛苦了!先回帖再慢慢看
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-16 10:14 , Processed in 0.418694 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表