QQ互聯OAuth2.0 .NET SDK 發布以及網站QQ登陸範例程式碼

來源:互聯網
上載者:User

OAuth: OAuth(開放授權)是一個開放標準,允許使用者授權第三方網站訪問他們儲存在另外的服務提供者上的資訊,而不需要將使用者名稱和密碼提供給第三方網站或分享他們資料的所有內容。

QQ登入OAuth2.0:對於使用者相關的OpenAPI(例如擷取使用者資訊,動態同步,照片,日誌,分享等),為了保護使用者資料的安全和隱私,第三方網站訪問使用者資料前都需要顯式的向使用者徵求授權。
QQ登入OAuth2.0採用OAuth2.0標準協議來進行使用者身分識別驗證和擷取使用者授權,相對於之前的OAuth1.0協議,其認證流程更簡單和安全。具體參考文檔 :【QQ登入】OAuth2.0開發文檔。

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入口),其他類主要是模型,配置類。

1、你得去http://connect.qq.com/ 申請一個帳號,會得到一個APP ID和App Key,這兩個東東會在產生請求的時候用到。你的去填一些資料,還要提交一些資料審核。

在設定檔web.config加入QQ登陸所需要的一些配置參數,如所示:

<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認證地址:

2、在項目中添加三個引用Newtonsoft.Json.dll、RestSharp.dll和 QConnectSDK.dll, 在頁面上放置按鈕,開啟qq登入的頁面,然後登入成功之後回調您的網站的頁面。此時如果使用者在你的網站有帳號,那就可以綁定現有帳號,或者新註冊一個帳號。如果你是建立站,也可以完全使用qq登入來作為使用者體系。

下面上代碼:

        /// <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號是一一對應關係。

本地測試
  • 前提準備,瞭解本地Host檔案的作用
  1. 找到C:\WINDOWS\system32\drivers\etc\hosts這個檔案
  2. 用文本方式開啟
  3. 增加一行:127.0.0.1 www.domain.com
  4. 啟動本機伺服器
  5. 啟動瀏覽器訪問 http://www.domain.com/
其他
  • 下載: http://opensns.codeplex.com/
  • 項目樣本:http://www.win8charm.com/ 
  • SDK 線上文檔:http://help.win8charm.com/ 
  • QQ群:80767552
  • 註:眾人拾柴火焰高,歡迎各位反饋使用中的bug。
  • 報告issue請來:http://opensns.codeplex.com/workitem/list/basic
  • 站內信或者下面方式
  • 微博:http://t.qq.com/geffzhang
  • 郵箱:geffzhang#qq.com
  • 部落格:http://www.cnblogs.com/shanyou 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.