天天看點

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

上節内容:

本節内容:

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

2:源碼下載下傳

3:擴充機制說明 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

實作ui.gethtml()方法:

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

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

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

        public static string gethtml()

        {

            string link = "<a href=\"{0}\" target=\"_blank\"><img src=\"{1}\" /></a>";

            stringbuilder sb = new stringbuilder();

            foreach (keyvaluepair<string,oauth2base> 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();

         } 

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

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

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

2:授權類型應該包括一些配置項,可以直接讀取: ob.value.oauthurl, ob.value.appkey,ob.value.imgurl

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

ok,讓我們回頭看看:

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

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

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

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

2:繼續基類 oauth2base,實作不同的授權:sinaweibooauth、qqauth、其它...等!

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

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

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

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

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

代碼:

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

        static dictionary<string, oauth2base> _serverlist;

        /// <summary>

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

        /// </summary>

        internal static dictionary<string, oauth2base> serverlist

            get

                if (_serverlist == null)

                    _serverlist = new dictionary<string, oauth2base>(stringcomparer.ordinalignorecase);

                    _serverlist.add(oauthserver.sinaweibo.tostring(), new sinaweibooauth());//新浪微網誌

                    _serverlist.add(oauthserver.qq.tostring(), new qqoauth());//qq微網誌

                return _serverlist;

            } 

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

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

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

3.3 oauth2 綁定網站的賬号實作第三方登陸:

如何和自己的網站的賬号實作綁定?

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

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

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

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

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

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

内置的文本資料庫解決方案:

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

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

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

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;

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

在oauth2base基類裡有兩個和内置文本資料庫打交首的函數:getbindaccount和setbindaccount:

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

        /// 添加綁定賬号

        /// <param name="bindaccount"></param>

        /// <returns></returns>

        public bool setbindaccount(string bindaccount)

            bool result = false;

            if (!string.isnullorempty(openid) && !string.isnullorempty(token) && !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;

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

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

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

二:源碼下載下傳

三:擴充機制說明 

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

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

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

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

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

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

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

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

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

b:移除cyq.data v5版本,更換底層元件,您隻要重寫oauth2base中的 setbindaccount和getbindaccount兩個方法即可,然後自己另外存儲資料媒體。

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

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

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

版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:

http://www.cnblogs.com/cyq1162/archive/2012/11/07/2756848.html