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

本文涉及的产品
数据可视化DataV,5个大屏 1个月
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介:
上节内容:

本节内容:
1:简述组件设计的过程及思路及 部分重点源码讲解
2:源码下载
3:扩展机制说明 
附源码截图:等会看以下思路时,可以对照着看:

一:简述组件设计的过程及思路
1:为什么想到弄成组件?
当重复的代码或相似的事件>=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 =  " <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及设计的是文本数据库,所以不用去兼容不同网站的数据库,自动生成文本数据库外置,只需要好好玩这个实体就可以了。
简单的就介绍到这了,设计并不复杂,代码量并不多,方法和成员也很少。

二:源码下载
源码点击下载:   OAuth2_Source.rar( download)

三:扩展机制说明  
看完本文,下完源码,也许您可能会有以下功能需要进行调整,这里给出指导与说明:
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 ,如需转载请自行联系原作者



相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
6月前
|
移动开发 小程序 JavaScript
(一)、项目介绍及知识点概述【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
(一)、项目介绍及知识点概述【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
97 0
|
5月前
|
程序员 API 数据安全/隐私保护
程序员必知:【转】新浪微博开放平台开发步骤简介(适合新手看)
程序员必知:【转】新浪微博开放平台开发步骤简介(适合新手看)
36 0
|
安全 Java Serverless
65w字!阿里分布式开发小册Github新开源!原理实践双飞
我们都知道传统的集中式系统已无法满足当今的互联网三高需求,所以现在的系统架构都是向着分布式系统不断演进。同时,越来越多的企业选择通过云的方式发布和部署应用,这也大大促进了分布式系统的发展。未来将是分布式系统“爆发”的时代。
|
JavaScript IDE 前端开发
HaaS EDU K1开发实践|阿里云产品内容精选(四十七)
HaaS(Hardware as a Service)物联网设备云端一体开发框架,整合阿里云、达摩院、平头哥技术,基于数亿物联网设备接入经验,提供积木式硬件开发能力,实现低代码快速开发,帮助中小开发者聚焦业务,实现设备安全上云,加速设备创新迭代。
|
前端开发 JavaScript 物联网
前端技术解读|阿里云产品内容精选(二十七)
本文内容选自阿里云开发者社区前端版块
|
JavaScript 关系型数据库
《OdooERP应用与开发基础》试读:第一章-Odoo概述
文/开源智造联合创始人老杨 本文来自《OdooERP应用与开发基础(第6版)》的试读章节。书籍尚未出版,请勿转载。欢迎您反馈阅读意见。 Odoo是什么 Odoo,以前叫OpenERP,是比利时Odoo S.A.公司开发的一个企业应用软件套件,开源套件包括一个企业应用快速开发平台,以及几千个Odoo及第三方开发的企业应用模块。
2449 0
下一篇
无影云桌面