前几天写了一篇关于网站集成QQ登录的文章受到不少网友的好评,期间有不少网友私信能不能写一篇关于网站集成新浪微博登录功能的文章,于是这些天抽空写了这篇文章,希望能帮到有需要的朋友。
一.前期准备
网站要想集成新浪微博登录功能,你需要先去新浪微博的开放平台注册一个开发者账号,新浪微博开放平台地址:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 注册完了以后,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图。最后我们会有一个App Key和App Secret ,有了这两个东西才能实现后面的集成微博登录功能。
二.开发工作
当我们的账号审核后,微博开发平台会给我们一个APP ID和APP KEY,有了这两个,我们就可以进行开发的工作了。
微博开放接口的调用,如发微博、关注等,都是需要获取用户身份认证的。目前微博开放平台用户身份鉴权主要采用的是OAuth2.0。另外,为了方便开发者开发、测试自己的应用,新浪微博还提供了Basic Auth的身份鉴权方式,但Basic Auth仅适用于应用所属的开发者自己调用接口。
OAuth2.0概述
OAuth2.0较1.0相比,整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式。
关于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="https://www.daqiuma.com/Account/WeiboConnect/"/> <add key="WeiboAuthorizeURL" value="https://api.weibo.com/oauth2/authorize" />
第二步.在Controllers中加一个登陆的Action(我这边用的是MVC的开发方式,如果是传统.NET的可以直接在.aspx的Page_Load事件里加如下方法)
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); }
这一步主要就是实现点击微博登录后出现一个微博授权的页面,大概如下图:
第三步.
在点击了上图的同意登录后(也就是已经使用微博账号在微博平台登录),微博开放平台会通过我们上面配置的回调地址也就是我这边填的https://www.daqiuma.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效果
大家可以直接访问https://www.daqiuma.com看一下实际的效果,最后还是那句话:赠人玫瑰 手有余香!如觉得对你有帮助则多转发,以帮助更多的人,如有不足,还请指正!