OAuth: OAuth(開放受權)是一個開放標準,容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要將用戶名和密碼提供給第三方網站或分享他們數據的全部內容。html
QQ登陸OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日誌,分享等),爲了保護用戶數據的安全和隱私,第三方網站訪問用戶數據前都須要顯式的向用戶徵求受權。
QQ登陸OAuth2.0採用OAuth2.0標準協議來進行用戶身份驗證和獲取用戶受權,相對於以前的OAuth1.0協議,其認證流程更簡單和安全。具體參考文檔 :【QQ登陸】OAuth2.0開發文檔。web
QQ互聯網站已經提供了PHP,JS,Android和iOS的SDK,缺乏.NET版本的SDK,春節假期期間利用一些空閒時間封裝了一個具備徹底功能的.NET SDK,後續將封裝一個對應的Windows Phone的SDK,並開源放在http://opensns.codeplex.com ,專門搭建了一個示例網站http://www.win8charm.com/ 和MSDN風格的在線幫助網站http://help.win8charm.com/ 。今天這篇文章主要介紹使用.NET SDK實施QQ登錄功能。瀏覽器
從這裏http://opensns.codeplex.com/ 下載最新版本的SDK,最新版本是Beta, 完成SDK的封裝,但願你們使用幫忙測試,SDK依賴於Newtonsoft.Json和RestSharp兩個程序集,具體能夠參考使用RestSharp 庫消費Restful Service。 主要是兩個類QzoneContext(QQ登錄的上下文數據) 和 QOpenClient (QQ互聯API入口),其餘類主要是模型,配置類。安全
一、你得去http://connect.qq.com/ 申請一個帳號,會獲得一個APP ID和App Key,這兩個東東會在生成請求的時候用到。你的去填一些資料,還要提交一些資料審覈。服務器
在配置文件web.config加入QQ登錄所須要的一些配置參數,以下圖所示:app
<configuration> <configSections> <sectionGroup name="QQSectionGroup"> <section name="QzoneSection"
type="System.Configuration.NameValueSectionHandler,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" /> </sectionGroup> </configSections> <QQSectionGroup> <QzoneSection> <add key="AppKey" value="" /> <add key="AppSecret" value="" /> <add key="CallBackURI" value="" /> <add key="AuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" /> </QzoneSection> </QQSectionGroup>
AppKey是申請QQ登陸成功後,分配給應用的appid;AppSecret是申請QQ登陸成功後,分配給網站的appkey;CallBackURI是QQ登錄成功後的回調地址:AuthorizeURL是QQ互聯的OAth2認證地址:dom
二、在項目中添加三個引用Newtonsoft.Json.dll、RestSharp.dll和 QConnectSDK.dll, 在頁面上放置按鈕,打開qq登陸的頁面,而後登陸成功以後回調您的網站的頁面。此時若是用戶在你的網站有帳號,那就能夠綁定現有帳號,或者新註冊一個帳號。若是你是新建站,也能夠徹底使用qq登陸來做爲用戶體系。post
下面上代碼:測試
/// <summary> /// QQ登錄頁面 /// </summary> [HttpGet] public ActionResult Login(string returnUrl) { this.Session[RETURNURL] = returnUrl; var context = new QzoneContext(); string state = Guid.NewGuid().ToString().Replace("-", ""); Session["requeststate"] = state; string scope = "get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr"; var authenticationUrl = context.GetAuthorizationUrl(state, scope); return new RedirectResult(authenticationUrl); } /// <summary> /// 回調頁面 /// </summary> public ActionResult QQConnect(LoginModel model) { if (Request.Params["code"] != null) { QOpenClient qzone = null; var verifier = Request.Params["code"]; var state = Request.Params["state"]; string requestState = Session["requeststate"].ToString(); if (state == requestState) { qzone = new QOpenClient(verifier, state); var currentUser = qzone.GetCurrentUser(); if (this.Session["QzoneOauth"] == null) { this.Session["QzoneOauth"] = qzone; } var friendlyName = currentUser.Nickname; var isPersistentCookie = true; SetAuthCookie(qzone.OAuthToken.OpenId, isPersistentCookie, friendlyName); return Redirect(Url.Action("Index", "Home")); } } return View(); }
上面的代碼是ASP.NET MVC的,項目示例運行在http://www.win8charm.com/ ,下面貼個ASP.NET WebForm的代碼示例:網站
QQ登錄頁面
namespace OpenConnect.WebSample.Account { public partial class LoginToQQ : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { GetRequestToken(); } private void GetRequestToken() { var context = new QzoneContext(); string state = Guid.NewGuid().ToString().Replace("-", ""); string scope = "get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr"; var authenticationUrl = context.GetAuthorizationUrl(state,scope); //request token, request token secret 須要保存起來 //在demo演示中,直接保存在全局變量中.真實狀況須要網站本身處理 Session["requeststate"] = state; Response.Redirect(authenticationUrl); } } }
回調頁面
namespace OpenConnect.WebSample.Account { public partial class QQCallback : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.Params["code"] != null) { QOpenClient qzone = null; User currentUser = null; var verifier = Request.Params["code"]; string state = Session["requeststate"].ToString(); qzone = new QOpenClient(verifier, state); currentUser = qzone.GetCurrentUser(); if (null != currentUser) { this.result.Text = "成功登錄"; this.Nickname.Text = currentUser.Nickname; this.Figureurl.ImageUrl = currentUser.Figureurl; } Session["QzoneOauth"] = qzone; } } }
這裏說明一下使用QQ互聯登錄是獲取不到用戶的QQ號的,只會獲取到用戶的OpenId,OpenID和QQ號是一一對應關係。