天天看點

通用社群登陸元件技術分享(開源)下篇:OAuth 源碼下載下傳及原了解說

<b>上節内容:</b>

本節内容:

<b></b>

<b>1:簡述元件設計的過程及思路及</b><b>部分重點源碼講解</b>

2:源碼下載下傳

3:擴充機制說明 

附源碼截圖:等會看以下思路時,可以對照着看:

一:簡述元件設計的過程及思路

1:為什麼想到弄成元件?

當重複的代碼或相似的事件&gt;=2個時,我都會想一下,是否還可能有第3個,第4個相近的,如果有,就會統一處理,元件就是設計的再通用一些。

2:本人設計元件的原則? 

2.1:讓使用者以最簡單的方式使用或調用元件,編寫代碼量最小化;

2.2:所有的設計,都參考第2.1點。

3:本人元件設計的簡單思路過程:(5行代碼的設計思路)

3.1:使用者的操作UI設計:

如上圖的第三方授權登陸如何展示?

在html裡直接寫死?感覺不給力,而且如果擴充多幾個第三方登陸時,又要去組合網址,是件麻煩事。

是以我想到了應該有UI類,應該有個GetHtml(),這樣來解決讓調用更簡單。

實作UI.GetHtml()方法:

這裡也是有點知識點的,為了讓代碼簡潔化,我花了不少時間思考,通過良好的代碼組合設計,減少代碼量的編寫。

于是,我用了一個常用方法,來優化這種設計:

        public static string GetHtml()

        {

            string link = "&lt;a href=\"{0}\" target=\"_blank\"&gt;&lt;img src=\"{1}\" /&gt;&lt;/a&gt;";

            StringBuilder sb = new StringBuilder();

            foreach (KeyValuePair&lt;string,OAuth2Base&gt; ob in OAuth2Factory.ServerList)

            {

                if (!string.IsNullOrEmpty(ob.Value.AppKey))

                {

                    sb.AppendFormat(link, string.Format(ob.Value.OAuthUrl, ob.Value.AppKey,System.Web.HttpUtility.UrlEncode(ob.Value.CallbackUrl), ob.Key), ob.Value.ImgUrl);

                }

            }

            return sb.ToString();

         } 

<b> 這段代碼裡,包含了幾種優化思路:</b>

1:應該有一個方法,可以擷取目前所有的授權類型: OAuth2Factory.ServerList。

2:授權類型應該包括一些配置項,可以直接讀取: ob.Value.OAuthUrl, ob.Value.AppKey,ob.Value.ImgUrl

在想出這種方法時,還沒開始設計OAuth2授權相關類,是以當時還隻是僞代碼,随着OAuth2類被完善,這裡的代碼就簡單成型了。

OK,讓我們回頭看看:

3.2:OAuth授權類設計(傳說的抽象+工廠):

和資料庫多資料庫支援的設計思路如出一折。

1:應該有個基類:OAuth2Base(包括通用的方法和屬性)

2:繼續基類 OAuth2Base,實作不同的授權:SinaWeiboOAuth、QQAuth、其它...等!

3:有個工廠OAuth2Factory來傳回目前的授權類型(正如資料庫元件來設計目前是操作哪種資料庫類型)

4:有個小工具類Tool,放幾個常用的小方法。

在OAuth2Factory裡,我們通過預先注冊所有的子類授權,來彙總所有的授權類型。

是以GetHtml裡可以擷取所有授權類型進行周遊組裝。

代碼:

        static Dictionary&lt;string, OAuth2Base&gt; _ServerList;

        /// &lt;summary&gt;

        /// 擷取所有的類型(新開發的OAuth2需要到這裡注冊添加一下)

        /// &lt;/summary&gt;

        internal static Dictionary&lt;string, OAuth2Base&gt; ServerList

            get

                if (_ServerList == null)

                    _ServerList = new Dictionary&lt;string, OAuth2Base&gt;(StringComparer.OrdinalIgnoreCase);

                    _ServerList.Add(OAuthServer.SinaWeiBo.ToString(), new SinaWeiBoOAuth());//新浪微網誌

                    _ServerList.Add(OAuthServer.QQ.ToString(), new QQOAuth());//QQ微網誌

                return _ServerList;

            } 

整體的設計并不複雜,隻要實作後,就可以實作授權,并得到第三方的token和openid資料。

到這裡,并未實作綁定賬号,于是我開始思考:

<b>3.3 OAuth2 </b><b>綁定</b><b>網站的賬号實作第三方登陸:</b>

<b>如何和自己的網站的賬号實作綁定?</b>

在原來網站的資料庫裡,添加字段?或者建立新表,再進行設計?

考慮到這樣的設計,和網站代碼結合度必然很深,不可能做到通用型,而且不同網站,用的是不同的資料庫,那得編寫多少種不同的腳本?

是以思前想後,将資料外置存儲在外部文本,考慮到CYQ.Data V5已經接近完美的支援文本資料庫及CodeFirst操作,是以引用它做為預設的外置資料庫操作類。

當然拿到源碼後,如果對于外存儲過塊需要調整或使用其它架構,這個自行操作了,不幹涉内政。 

<b>内置的文本資料庫解決方案:</b>

如果對比上面的源碼截圖,你應該發現,是以類都提到了,隻剩下最後一個:OAuth2Account ,它就是實作和網站綁定的罪人。

代碼也很簡單的說(除了繼承自OrmBase和構造函數指定了表名和文本存儲路徑,基本上就是一個常見的實體類了):

public class OAuth2Account:CYQ.Data.Orm.OrmBase

    {

        public OAuth2Account()

            base.SetInit(this, "OAuth2Account", "Txt Path={0}App_Data");

        }

        private int _ID;

        public int ID

                return _ID;

            set

                _ID = value;

        private string _OAuthServer;

        /// 授權的服務類型

        public string OAuthServer

                return _OAuthServer;

                _OAuthServer = value;

        private string _Token;

        /// 儲存的Token

        public string Token

                return _Token;

                _Token = value;

        private string _OpenID;

        /// 儲存對應的ID

        public string OpenID

                return _OpenID;

                _OpenID = value;

        private string _BindAccount;

        private DateTime _ExpireTime;

        /// 過期時間

        public DateTime ExpireTime

                return _ExpireTime;

                _ExpireTime = value;

        private string _NickName;

        /// 傳回的第三方昵稱

        public string NickName

                return _NickName;

                _NickName = value;

        private string _HeadUrl;

        /// 傳回的第三方賬号對應的頭像位址。

        public string HeadUrl

                return _HeadUrl;

                _HeadUrl = value;

        /// 綁定的賬号

        public string BindAccount

                return _BindAccount;

                _BindAccount = value;

在OAuth2Base基類裡有兩個和内置文本資料庫打交首的函數:GetBindAccount和SetBindAccount:

        /// 添加綁定賬号

        /// &lt;param name="bindAccount"&gt;&lt;/param&gt;

        /// &lt;returns&gt;&lt;/returns&gt;

        public bool SetBindAccount(string bindAccount)

            bool result = false;

            if (!string.IsNullOrEmpty(openID) &amp;&amp; !string.IsNullOrEmpty(token) &amp;&amp; !string.IsNullOrEmpty(bindAccount))

                using (OAuth2Account oa = new OAuth2Account())

                    if (!oa.Exists(string.Format("OAuthServer='{0}' and OpenID='{1}'", server, openID)))

                    {

                        oa.OAuthServer = server.ToString();

                        oa.Token = token;

                        oa.OpenID = openID;

                        oa.ExpireTime = expiresTime;

                        oa.BindAccount = bindAccount;

                        oa.NickName = nickName;

                        oa.HeadUrl = headUrl;

                        result = oa.Insert(CYQ.Data.InsertOp.None);

                    }

            return result;

由于是CodeFirst及設計的是文本資料庫,是以不用去相容不同網站的資料庫,自動生成文本資料庫外置,隻需要好好玩這個實體就可以了。

<b>簡單的就介紹到這了,設計并不複雜,代碼量并不多,方法和成員也很少。</b>

二:源碼下載下傳

通用社群登陸元件技術分享(開源)下篇:OAuth 源碼下載下傳及原了解說
通用社群登陸元件技術分享(開源)下篇:OAuth 源碼下載下傳及原了解說

)

<b>三:擴充機制說明 </b> 

看完本文,下完源碼,也許您可能會有以下功能需要進行調整,這裡給出指導與說明:

1:界面UI的調整,具體看UI類,改動下即可。

2:增加授權種類:繼承OAuth2Base,參考已有的新浪微網誌和QQ進行操作,當然也可以聯系我讓我添加。

3:如何取得綁定後的表資料:隻要調用new  OAuth2Account().Select().Bind(清單);

4:更換授權存儲媒體,有兩種方式:

a:保留CYQ.Data V5版本,更換資料庫,隻需要修改OAuth2Account類的構造函數的資料庫連結更換為您現在使用的資料庫連結即可。

CYQ.Data V5版本目前僅支援以下資料庫(mssql、mysql、oracle、aceess、sqlite、txt、xml),前三種需要授權使用,後四種免費使用。

b:移除CYQ.Data V5版本,更換底層元件,您隻要重寫OAuth2Base中的 SetBindAccount和GetBindAccount兩個方法即可,然後自己另外存儲資料媒體。

不管是哪種,對于有點開發經驗的新老手來說,都是相對比較簡單。

     本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/1052583,如需轉載請自行聯系原作者