大部分API的訪問如發表微博、獲取私信,關注都須要用戶身份,目前新浪微博開放平臺用戶身份鑑權有OAuth2.0和Basic Auth(僅用於應用所屬開發者調試接口),新版接口也僅支持這兩種方式。OAuth2.0較1.0相比整個受權驗證流程更簡單更安全,也是將來最主要的用戶身份驗證和受權方式。 關於OAuth2.0協議受權流程查看OAuth2.0受權流程 ,其中Client指第三方應用,Resource Owner指用戶,Authorization Server是咱們的受權服務器,Resource Server是API服務器。php
參考連接:http://blog.unvs.cn/archives/oauth-qq2.0-developer.html 以及新浪微博開放平臺和新浪微博CodeProject開源項目html
開發者能夠先瀏覽OAuth2.0的接口文檔,熟悉OAuth2的接口及參數的含義,而後咱們根據應用場景各自說明如何使用OAuth2.0。web
OAuth2 接口文檔api
接口 | 說明 |
---|---|
OAuth2/authorize | 請求用戶受權Token |
OAuth2/access_token | 獲取受權過的Access Token |
OAuth2/get_token_info | 受權信息查詢接口 |
OAuth2/revokeoauth2 | 受權回收接口 |
OAuth2/get_oauth2_token | OAuth1.0的Access Token更換至OAuth2.0的Access Token |
2、OAuth2.0 新浪受權頁瀏覽器
一、首先要獲取appKey 和 appSecret,這個獲取的方法能夠從新浪微博新手指南 根據步驟一步一步的獲取到。callBack地址這裏採用默認的:https://api.weibo.com/oauth2/default.html,採用的是網站接入方式。下面是C#示例源碼(控制檯應用程序):安全
01.using System; 02.using System.Collections.Generic; 03.using System.Linq; 04.using System.Text; 05.using NetDimension.Weibo; 06.using System.Net; 07. 08.namespace SinaWeiboTestApp 09.{ 10. class Program 11. { 12. 13. static void Main(string[] args) 14. { 15. 16. string appkey = "124543453288"; 17. string appsecret = "3a456c5332fd2cb1178338fccb9fa51c"; 18. //string callBack = "http://127.0.0.1:3170/WebSite2/Default.aspx"; 19. string callBack = "https://api.weibo.com/oauth2/default.html"; 20. var oauth = new NetDimension.Weibo.OAuth(appkey,appsecret,callBack); 21. 22. ////模擬登陸 23. //string username = "xxxxxxxx@163.com"; 24. //string password = "xxxxxxx"; 25. //oauth.ClientLogin(username, password); //模擬登陸下,沒啥好說的,你也能夠改爲標準登陸。 26. 27. //標準登陸 28. var authUrl = oauth.GetAuthorizeURL(); 29. //string redirectUrl; 30. //HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(authUrl); 31. //request.Referer = authUrl; 32. //request.AllowAutoRedirect = false; 33. //using (WebResponse response = request.GetResponse()) 34. //{ 35. // redirectUrl = response.Headers["Location"]; 36. // redirectUrl = response.ResponseUri.AbsolutePath; 37. //} 38. System.Diagnostics.Process.Start(authUrl); 39. Console.WriteLine("填寫瀏覽器地址中的Code參數:"); 40. var code = Console.ReadLine(); 41. var accessToken = oauth.GetAccessTokenByAuthorizationCode(code); 42. if (!string.IsNullOrEmpty(accessToken.Token)) 43. { 44. var sina = new NetDimension.Weibo.Client(oauth); 45. var uid = sina.API.Dynamic.Account.GetUID(); //調用API中獲取UID的方法 46. Console.WriteLine(uid); 47. } 48. 49. var Sina = new Client(oauth); 50. Console.WriteLine("開始發送異步請求..."); 51. 52. //例子1:異步獲取用戶的ID 53. //demo的運行環境是.net 4.0,下面展現的這種方法在2.0及以上版本環境下有效,3.0以上能夠用lambda表達式來簡化delegate的蛋疼寫法,請看下面的例子。 54. Sina.AsyncInvoke<string>( 55. //第一個代理中編寫調用API接口的相關邏輯 56. delegate() 57. { 58. Console.WriteLine("發送請求來得到用戶ID..."); 59. System.Threading.Thread.Sleep(8000); //等待8秒 60. return Sina.API.Entity.Account.GetUID(); 61. }, 62. //第二個代理爲回調函數,異步完成後將自動調用這個函數來處理結果。 63. delegate(AsyncCallback<string> callback) 64. { 65. if (callback.IsSuccess) 66. { 67. Console.WriteLine("獲取用戶ID成功,ID:{0}", callback.Data); 68. } 69. else 70. { 71. Console.WriteLine("獲取用戶ID失敗,異常:{0}", callback.Error); 72. } 73. } 74. ); 75. 76. //列子2:獲取公共微博列表 77. //2.0以上用lambda來寫,方便不是一點點 78. Sina.AsyncInvoke<NetDimension.Weibo.Entities.status.Collection>(() => 79. { 80. //獲取微博,接口調用,返回值是個NetDimension.Weibo.Entities.status.Collection,因此泛型T爲NetDimension.Weibo.Entities.status.Collection 81. Console.WriteLine("發送請求來得到公共微博列表..."); 82. return Sina.API.Entity.Statuses.PublicTimeline(); 83. //return Sina.API.Entity.Statuses.RepostTimeline; 84. }, (callback) => 85. { 86. if (callback.IsSuccess) 87. { 88. //異步完成後處理結果,result就是返回的結果,類型就是泛型所指定的NetDimension.Weibo.Entities.status.Collection 89. Console.WriteLine("得到公共微博列表成功,如今公共頻道發微博的人都是他們:"); 90. foreach (var status in callback.Data.Statuses) 91. { 92. if (status.User != null) 93. Console.WriteLine(status.User.ScreenName + " ");//打印公共微博發起人的姓名 94. } 95. Console.WriteLine(); 96. } 97. else 98. { 99. Console.WriteLine("獲取用戶ID失敗,異常:{0}", callback.Error); 100. } 101. 102. }); 103. 104. 105. Console.WriteLine("已發送全部異步請求。等待異步執行完成..."); 106. 107. Console.ReadKey(); //阻塞,等待異步調用執行完成 108. 109. } 110. 111. } 112.}
MVC中代碼:服務器
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Myself.Models; using Myself.Code; using BLL; using Lib; using SpeexToWavToMp3; using System.Web.Http.Filters; using Models; using Webdiyer.WebControls.Mvc; using System.IO; namespace Myself.Controllers { public class MySelfController : Controller { public ActionResult LoginSina() { var oauth = new NetDimension.Weibo.OAuth(appKey,appSecret,Url.Action("LoginSinaResult", "MySelf", null, "http")); //第一步獲取新浪受權頁面的地址 var oauthUrl = oauth.GetAuthorizeURL(); return Redirect(oauthUrl); } public ActionResult LoginSinaResult(string code) { var oauth = new NetDimension.Weibo.OAuth(appKey, appSecret, Url.Action("LoginSinaResult", "MySelf", null, "http")); var oauthToken = oauth.GetAccessTokenByAuthorizationCode(code); var model = UserHelper.GetAuthorizeInfo(oauthToken.UID, 1); if (model != null) { if (LoginHelper.UserLogin(model.UserID, 1, oauthToken.UID, Request.UserAgent, Request.UserHostAddress, "1", "web")) { return RedirectToAction("Index", "Home"); } else { return Content("登陸失敗"); } } return Content("您還沒有註冊"); } } }
若是要運行上述程序的話,須要把Appkey和Appsecret給替換掉。app
二、受權頁面異步
下面的是提示微博登錄的界面,登錄後提供第三方網站受權訪問你在新浪微博帳號上的資源函數
三、受權訪問頁面
四、新浪官方網站提供API測試工具,用來測試客戶端構造的參數是否正確
五、Oauth2.0運行流程圖
第一步:首先直接跳轉至用戶受權地址,即圖示 Request User Url ,提示用戶進行登陸,並給予相關資源受權,獲得惟一的Auth code,這裏注意的是code只有10分鐘的有效期,對於安全考慮,相對於OAuth1.0省了一步獲取臨時的Token,而且有效期也進行了控制,比1.0認證簡化了不少,並安全一些; 第二步:獲得受權code後,這一步就是請求access token,經過 圖示 Request access url ,生成獲得數據Token; 第三步:經過Access Token請求OpenID,openid是用戶在此平臺的惟一標識,經過 圖示 Request info url 請求,而後獲得OpenID; 第四步:經過第二步獲得的數據Token、第三步獲得的OpenID及相關API,進行請求,獲取用戶受權資源信息