QQ互聯OAuth2.0 .NET SDK 發佈以及網站QQ登陸示例代碼

来源:http://www.cnblogs.com/canfengfeixue/archive/2017/12/14/8035954.html
-Advertisement-
Play Games

OAuth: OAuth(開放授權)是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。 QQ登錄OAuth2.0:對於用戶相關的OpenAPI(例如獲取用戶信息,動態同步,照片,日誌,分享等),為了保護用戶數 ...


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/
其他

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原創不易,轉載請標明出處。上一篇《Java實驗--基於Swing的簡單的歌曲信息管理系統(一)》講解瞭如何這個小項目的具體情況和主要功能,下麵進入編碼階段。 在eclipse中新建java項目,項目的結構如下: 資料庫的設計 該項目簡單,只涉及到了兩種表,且沒有涉及到關聯查詢,就只是對單表進行操作。 ...
  • 字典的概念 字典是存儲數據的一種方式,與列表和元祖來說更靈活。元祖的局限性:值是無序,不可變的列表的局限性:如果裡面想存儲一個人的名字對應的值時dy,年齡對應的是30。使用一個列表是不行的如下: 1 >>> t=[name="dy",age=30] 2 File "<stdin>", line 1 ...
  • 本文使用python的第三方模塊requests爬取王者榮耀所有英雄的圖片,並將圖片按每個英雄為一個目錄存入文件夾中,方便用作桌面壁紙 下麵時具體的代碼,已通過python3.6測試,可以成功運行: 對於所要爬取的網頁連接可以通過王者榮耀官網找到, 下麵是保存抓取到的圖片的文件夾樣例: 以上就是抓取 ...
  • Object proxy:當前對象,即代理對象!在調用誰的方法! Method method:當前被調用的方法(目標方法) Object[] args:實參! 案例2: ...
  • 示例: 生成命令 person Mac$ javadoc -d . -version -author Person.java 註意Person.java路徑名要正確。 效果: 其中index.html為主頁,打開如下圖: ...
  • 增加的菜單欄效果圖如下: eclipse 中調整到 swt的design視圖下 控制項區域選擇Menu Controls 將Menu Bar拖動到視窗標題欄 將Cascaded Menu拖動到Menu Bar 依次將多個Menu Item加入到New SubMenu Separator是分隔符 也可以 ...
  • 1.1 編程與編程語言 1.1.1 編程語言 電腦的發明,是為了用機器解放人力,而編程的目的則是將人類的思想流程按照某種能夠被電腦識別的表達方式傳遞給電腦,從而達到讓電腦能夠像人腦一樣自動執行的效果。 編程即程式員根據需求把自己的思想流程按照某種編程語言的語法風格編寫下來,產出的結果就是包含 ...
  • 大家好,之前我們介紹了《IDEA環境下GIT操作淺析之一Idea下倉庫初始化與文件提交涉及到的基本命令》和《IDEA環境下GIT操作淺析之二-idea下分支操作相關命令》,本文是第3部分,承接這2篇文章,大家可以點擊回顧,下麵請看本篇正文。 一、本地倉庫初始化與遠程倉庫推送操作 Idea 基本環境配 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...