通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载和原理讲

上节情:

1:通用社区登陆组件技术分享(开源)上篇:OAuth
授权登陆介绍

2:通用社区登陆组件技术分享(开源)中篇:OAuth
登陆组件流程与零部件集成方法

 

本节情:

1:简述组件设计之进程以及思路以及一些至关重要源码讲解**

2:源码下载

3:扩展机制说明 

附源码截图:等会看之下思路时,可以对比着看:

图片 1

 

一致:简述组件设计之经过与思路

 

1:为什么想到将成组件?

当还的代码或相似的波>=2个时,我都见面怀念转手,是否还可能有第3只,第4只类似之,如果产生,就会见统一处理,组件就是统筹之重通用一些。

 

2:本人设计组件的尺码? 

2.1:让用户以无限简单易行的章程采取要调用组件,编写代码量最小化;

2.2:所有的筹划,都参照第2.1触及。

 

3:本人组件设计之概括思路过程:(5行代码的设计思路)


3.1:用户之操作UI设计:

 

图片 2 

若达到图的老三正值授权登陆如何展示?

于html里直接写深?感觉不给力,而且一旦扩展多几单第三着登陆时,又使错过成网址,是起麻烦事。

之所以我想到了应当产生UI类,应该生出只GetHtml(),这样来解决被调用更简便。

 

实现UI.GetHtml()方法:

此也是发出硌知识点的,为了让代码简洁化,我花了众多时刻考虑,通过完美的代码组合设计,减少代码量的编排。

 

于是,我之所以了一个常用方法,来优化这种计划:

        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();

         } 

当下段代码里,包含了几种优化思路:

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<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;
            }

圆的计划性并无复杂,只要实现后,就好兑现授权,并取得第三着的token和openid数据。

 

交这里,并未实现绑定账号,于是自己起思索:

3.3
OAuth2 绑定网站的账号实现第三在登陆:

安和投机之网站的账号实现绑定?

于本网站的数据库里,添加字段?或者创造新表,再开展统筹?

考虑到这般的计划,和网站代码结合度必然很充分,不可能毕其功于一役通用型,而且不同网站,用的凡见仁见智的数据库,那得修多少种不同的剧本?

用思前纪念后,将数据外置存储于表文本,考虑到CYQ.Data
V5已经接近完美的支撑文件数据库与CodeFirst操作,所以引用它举行吧默认的外置数据库操作类。

 

本将到源码后,如果对他存储过块用调动还是以其他框架,这个自动操作了,不干涉内政。 

 

放开的文件数据库解决方案:

假设对比上面的源码截图,你应该发现,所以类似都涉及了,只剩余最后一个: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
        {
            get
            {
                return _ID;
            }
            set
            {
                _ID = value;
            }
        }
        private string _OAuthServer;
        /// <summary>
        /// 授权的服务类型
        /// </summary>
        public string OAuthServer
        {
            get
            {
                return _OAuthServer;
            }
            set
            {
                _OAuthServer = value;
            }
        }
        private string _Token;
        /// <summary>
        /// 保存的Token
        /// </summary>
        public string Token
        {
            get
            {
                return _Token;
            }
            set
            {
                _Token = value;
            }
        }
        private string _OpenID;
        /// <summary>
        /// 保存对应之ID
        /// </summary>
        public string OpenID
        {
            get
            {
                return _OpenID;
            }
            set
            {
                _OpenID = value;
            }
        }
        private string _BindAccount;
        
        private DateTime _ExpireTime;
        /// <summary>
        /// 过期时
        /// </summary>
        public DateTime ExpireTime
        {
            get
            {
                return _ExpireTime;
            }
            set
            {
                _ExpireTime = value;
            }
        }

        private string _NickName;
        /// <summary>
        /// 返回的老三正值昵称
        /// </summary>
        public string NickName
        {
            get
            {
                return _NickName;
            }
            set
            {
                _NickName = value;
            }
        }
        private string _HeadUrl;
        /// <summary>
        /// 返回的老三正账号对应之头像地址。
        /// </summary>
        public string HeadUrl
        {
            get
            {
                return _HeadUrl;
            }
            set
            {
                _HeadUrl = value;
            }
        }

        /// <summary>
        /// 绑定的账号
        /// </summary>
        public string BindAccount
        {
            get
            {
                return _BindAccount;
            }
            set
            {
                _BindAccount = value;
            }
        }

于OAuth2Base基类里发生些许单与搭文本数据库打交首的函数:GetBindAccount和SetBindAccount:

        /// 添加绑定账号
        /// </summary>
        /// <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;
        }

由于是CodeFirst及计划的凡文件数据库,所以不用去兼容不同网站的数据库,自动生成文本数据库外置,只待好好玩这个实体就可了。

概括的就算介绍及当下了,设计并无复杂,代码量并无多,方法以及成员为蛮少。

 

其次:源码下载

 

源码点击下载: 图片 3
OAuth2_Source.rar(图片 4)

 

老三:扩展机制说明 

 

在押罢本文,下结束源码,也许你可能会见产生以下职能要开展调,这里吃起点和认证:

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两个章程即可,然后自己另外存储数据介质。

 

 

随便是哪种,对于有些开发经历的初老手来说,都是相对比较简单。

51cto大赛的参赛页面,感谢路过的冤家吗顺手丢掉一票:http://blog.51cto.com/contest2012/2127378  

 

网站地图xml地图