前幾天寫了一篇關於網站集成QQ登陸的文章受到很多網友的好評,期間有很多網友私信能不能寫一篇關於網站集成新浪微博登陸功能的文章,因而這些天抽空寫了這篇文章,但願能幫到有須要的朋友。html
一.前期準備json
網站要想集成新浪微博登陸功能,你須要先去新浪微博的開放平臺註冊一個開發者帳號,新浪微博開放平臺地址:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 註冊完了之後,完了登陸後臺會有相似以下的一個後臺,填好相關信息,具體能夠參考下圖。最後咱們會有一個App Key和App Secret ,有了這兩個東西才能實現後面的集成微博登陸功能。api
二.開發工做安全
當咱們的帳號審覈後,微博開發平臺會給咱們一個APP ID和APP KEY,有了這兩個,咱們就能夠進行開發的工做了。服務器
微博開放接口的調用,如發微博、關注等,都是須要獲取用戶身份認證的。目前微博開放平臺用戶身份鑑權主要採用的是OAuth2.0。另外,爲了方便開發者開發、測試本身的應用,新浪微博還提供了Basic Auth的身份鑑權方式,但Basic Auth僅適用於應用所屬的開發者本身調用接口。app
OAuth2.0概述
OAuth2.0較1.0相比,整個受權驗證流程更簡單更安全,也是將來最主要的用戶身份驗證和受權方式。dom
關於OAuth2.0協議的受權流程能夠參考下面的流程圖,其中Client指第三方應用,Resource Owner指用戶,Authorization Server是咱們的受權服務器,Resource Server是API服務器。測試
開發者能夠先瀏覽OAuth2.0的接口文檔,熟悉OAuth2.0的接口及參數的含義,而後咱們根據應用場景各自說明如何使用OAuth2.0。具體API文檔能夠參考微博的官方文檔:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI好了,介紹完這些咱們如今開始進入正題。
第一步.先在WebConfig中的 <appSettings>節點下加入以下配置網站
<add key="WeiboAppID" value="第一張截圖中微博分配給你網站的App Key" /> <add key="WeiboAppKey" value="第一張截圖中的App Secret"/> <add key="WeiboCallBack" value="http://www.mylanqiu.com/Account/WeiboConnect/"/> <add key="WeiboAuthorizeURL" value="https://api.weibo.com/oauth2/authorize" />
第二步.在Controllers中加一個登錄的Action(我這邊用的是MVC的開發方式,若是是傳統.NET的能夠直接在.aspx的Page_Load事件里加以下方法)
ui
public ActionResult LoginWeibo() { string state = new Random(100000).Next(99, 99999).ToString();//隨機數 Session["WeiboState"] = state; string appID = ConfigurationManager.AppSettings["WeiboAppID"]; string qqAuthorizeURL = ConfigurationManager.AppSettings["WeiboAuthorizeURL"]; string callback = ConfigurationManager.AppSettings["WeiboCallBack"]; string authenticationUrl = string.Format("{0}?client_id={1}&redirect_uri={2}&state={3}", qqAuthorizeURL, appID, callback, state);//要轉跳到微博驗證的地址 return new RedirectResult(authenticationUrl); }
這一步主要就是實現點擊微博登陸後出現一個微博受權的頁面,大概以下圖:
第三步.
在點擊了上圖的贊成登陸後(也就是已經使用微博帳號在微博平臺登陸),微博開放平臺會經過咱們上面配置的回調地址也就是我這邊填的http://www.mylanqiu.com/Account/WeiboConnect/返回到這個頁面,並會返回一個code給咱們,咱們到時會使用這個code再去微博開發平臺獲取access_token,並經過這個access_token獲取登陸的相關用戶信息。具體代碼以下:
public ActionResult WeiboConnect() { if (!string.IsNullOrEmpty(Request.Params["code"]) && !string.IsNullOrEmpty(Request.Params["state"])) { var code = Request.Params["code"]; var state = Request.Params["state"]; string requestState = Session["WeiboState"] == null ? "" : Session["WeiboState"].ToString(); if (state == requestState) { try { WeiboOAuthHelper QAuthHelper = new WeiboOAuthHelper();//輔助類 WeiboOauthInfo oauthInfo = QAuthHelper.GetOauthInfo(code);//獲取Access Token string openID = QAuthHelper.GetOpenID(oauthInfo);//獲取用的惟一ID Session["WeiboOpenID"] = openID; string nickName = QAuthHelper.GetUserInfo(oauthInfo, openID); UserAccount userAccount = AccountBLL.GetUserAccountByOpenID(OAuthPlatform.Weibo.ToString(), openID); if (userAccount != null) { SetAuthCookie(userAccount); Response.Write("<script> window.opener.location.reload();window.close();</script>"); } ViewData["NickName"] = nickName; } catch (Exception ex) { return new RedirectResult("~/Error/Error.htm"); } } else { return new RedirectResult("~/Error/Error.htm"); } } else { return new RedirectResult("~/Error/Error.htm"); } return View(); }
經過上面的代碼咱們就能實現微博的集成驗證,下面把這個輔助類的源代碼說一下,以下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Configuration; using System.Net; using System.Web; using System.IO; using System.Web.Script.Serialization; namespace Com.ABC.Mylanqiu.BLL { public class WeiboOAuthHelper { string appID = ConfigurationManager.AppSettings["WeiboAppID"]; string appKey = ConfigurationManager.AppSettings["WeiboAppKey"]; /// <summary> /// 獲取oauth信息 /// </summary> /// <param name="code"></param> /// <returns></returns> public WeiboOauthInfo GetOauthInfo(string code) { string callback = System.Web.HttpUtility.UrlEncode(ConfigurationManager.AppSettings["WeiboCallBack"], Encoding.UTF8); string url = string.Format("https://api.weibo.com/oauth2/access_token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}", "authorization_code", appID, appKey, code, callback); string res = LoadHtmlUserGetType(url, Encoding.UTF8,"POST"); JavaScriptSerializer serizalizer = new JavaScriptSerializer(); WeiboOauthInfo OauthInfo = serizalizer.Deserialize<WeiboOauthInfo>(res); return OauthInfo; } /// <summary> /// 經過GET方式獲取頁面的方法 /// </summary> /// <param name="urlString">請求的URL</param> /// <param name="encoding">頁面編碼</param> /// <returns></returns> public string LoadHtmlUserGetType(string urlString, Encoding encoding,string method) { HttpWebRequest httpWebRequest = null; HttpWebResponse httpWebRespones = null; Stream stream = null; string htmlString = string.Empty; try { httpWebRequest = WebRequest.Create(urlString) as HttpWebRequest; httpWebRequest.Method = method; } catch (Exception ex) { throw new Exception("創建頁面請求時發生錯誤!", ex); } httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)"; try { httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse(); stream = httpWebRespones.GetResponseStream(); } catch (Exception ex) { throw new Exception("接受服務器返回頁面時發生錯誤!", ex); } StreamReader streamReader = new StreamReader(stream, encoding); try { htmlString = streamReader.ReadToEnd(); } catch (Exception ex) { throw new Exception("讀取頁面數據時發生錯誤!", ex); } streamReader.Close(); stream.Close(); return htmlString; } /// <summary> /// 獲取微博帳號的OpenID /// </summary> /// <param name="qqOauthInfo"></param> /// <returns></returns> public string GetOpenID(WeiboOauthInfo oauthInfo) { string res = LoadHtmlUserGetType("https://api.weibo.com/2/account/get_uid.json?access_token=" + oauthInfo.access_token, Encoding.UTF8,"GET"); JavaScriptSerializer serizalizer = new JavaScriptSerializer(); WeiboUserID userInfo = serizalizer.Deserialize<WeiboUserID>(res); return userInfo.uid; } /// <summary> /// 獲取微博暱稱 /// </summary> /// <param name="qqOauthInfo"></param> /// <param name="openID"></param> /// <returns></returns> public string GetUserInfo(WeiboOauthInfo WeiboOauthInfo, string userID) { string urlGetInfo = string.Format(@"https://api.weibo.com/2/users/show.json?access_token={0}&uid={1}", WeiboOauthInfo.access_token, userID); string jsonUserInfo = LoadHtmlUserGetType(urlGetInfo, Encoding.UTF8,"GET"); JavaScriptSerializer serizalizer = new JavaScriptSerializer(); WeiboFullUserInfo fullUserInfo = serizalizer.Deserialize<WeiboFullUserInfo>(jsonUserInfo); return fullUserInfo.screen_name; } } public class WeiboOauthInfo { public string access_token { get; set; } public string expires_in { get; set; } public string remind_in { get; set; } public string uid { get;set;} } public class WeiboUserID { public string uid { get;set; } } public class WeiboFullUserInfo { public Int64 id { get; set; } public string screen_name { get; set; } } }
四.Demo效果
你們能夠直接訪問http://www.mylanqiu.com看一下實際的效果,最後仍是那句話:贈人玫瑰 手有餘香!如以爲對你有幫助則多轉發,以幫助更多的人,若有不足,還請指正!