通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载及原理解说
原文http://www.cnblogs.com/cyq1162/archive/2012/11/07/2756848.html
上节内容:
1:通用社区登陆组件技术分享(开源)上篇:OAuth 授权登陆介绍
2:通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法
本节内容:
1:简述组件设计的过程及思路及部分重点源码讲解
2:源码下载
3:扩展机制说明
附源码截图:等会看以下思路时,可以对照着看:
一:简述组件设计的过程及思路
1:为什么想到弄成组件?
2:本人设计组件的原则?
2.1:让用户以最简单的方式使用或调用组件,编写代码量最小化;
2.2:所有的设计,都参考第2.1点。
3:本人组件设计的简单思路过程:(5行代码的设计思路)
3.1:用户的操作UI设计:
如上图的第三方授权登陆如何展示?
在html里直接写死?感觉不给力,而且如果扩展多几个第三方登陆时,又要去组合网址,是件麻烦事。
所以我想到了应该有UI类,应该有个GetHtml(),这样来解决让调用更简单。
实现UI.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里可以获取所有授权类型进行遍历组装。
代码:
/// <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 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()
三:扩展机制说明
看完本文,下完源码,也许您可能会有以下功能需要进行调整,这里给出指导与说明:
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
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。 |
通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载及原理解说相关推荐
- 通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法...
本节包括以下内容: 1:第三方社区账号登陆的授权流程 2:OAuth2 组件的下载及web.config配置 3:OAuth2 组件的5行代码编写流程 4 :总结与下节内容预告 一: 第三方社区账号登 ...
- 最新猜骰子玩法源码分享+微信猜骰子源码下载
模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数. 先来介绍一下随机数的生成: 1.产生不定范围的随机数 函数原型:int rand() ...
- php拼音模糊查询,PHP模糊查询技术实例分析【附源码下载】
本文实例讲述了PHP模糊查询技术.分享给大家供大家参考,具体如下: 简介 从本质上揭密PHP模糊查询技术 功能 根据输入的关键字查找相关用户 PHP用户查询器案例分析 课程目标 掌握PHP模糊技术的应 ...
- 分享三个游戏源码下载网站
1.开源之家 https://www.enboo.cn https://www.enboo.cn/tags.php?/%D3%CE%CF%B7%D4%B4%C2%EB%CF%C2%D4%D8/-1/ ...
- 【华为云技术分享】Linux内核源码结构(1)
在上一期中,我们介绍了Linux内核发展的历史,也介绍了与其相关的UNIX和GNU的相关知识.从这一期开始,我们将介绍Linux内核的源码结构.我们将先根据Linux源码的目录结构进行分析,到本文章发 ...
- 华为鸿蒙系统学习笔记5-华为方舟编译器正式开源及相关源码下载
8月9日至8月11日,华为面向全球开发者的2019年开发者大会,将在东莞松山湖举行.据悉,今年也是华为第一次在华为松山湖基地欧洲小镇里举办开发者大会. 前不久,余承东曾在微博上预告:"让我们 ...
- 帝国时代2开源克隆版 源码下载OpenAge (c/c++)
OpenAge 是想做一个[帝国时代2]游戏引擎的开源克隆版.主要针对 POSIX 平台,如 GNU / Linux.这个项目同时也是想向 OpenMW.OpenRA 和 OpenTTD 三个项目学习 ...
- 产线数字化软件源码_软件生产线技术、开源软件声明、源码下载地址
软件生产线技术.开源软件声明.源码下载地址 软件生产线指生产软件的软件,先利用建模工具软件用图解的形式给出应用系统的系统模型,之后自动生成应用系统可执行程序,自动完成建立应用系统的工作.它能有效提高应 ...
- 快速搭建自己的跑腿服务平台:开源跑腿系统源码分享
在现代社会,人们生活节奏加快,很多时候需要在短时间内完成各种任务,如购物.送货等.这就催生了跑腿服务的兴起.跑腿服务平台为用户提供一站式服务,让用户可以轻松地找到可靠的跑腿服务,并实现便捷快速的服务体 ...
最新文章
- mp4格式解析、分割
- Linux系统ssh无法启动,Linux系统上SSH无法启动
- 如何在ASP.NET中用OWC绘制图表
- SpringMVC教程--异常处理器详解
- IEEE作者中心!解决你的选刊,模板,选题,写做的一系列困难!!!拿走不谢!!!
- 【转】关于arcgis server ADF的几种超时
- mysql只能查询出1000条数据_MySQL SELECT语句中只能输出1000行数据的原因
- 不安和怀疑,美丽而又危险:看两位80后女艺术家的展览
- Label 表达式绑定
- 平板电脑硬件如何测试软件,先锋(Pioneer)G71平板电脑软件测试评测-ZOL中关村在线...
- Spring循环依赖的三种方式
- springcloud hystrix概述(一)
- python开发跟淘宝有联系没_Python爬取淘宝店铺和评论
- Leetcod每日一题:151.reverse-words-in-a-string(翻转字符串里的单词)
- django-admin的源码流程
- springweb 初步理解
- DedeCMS5.5 调用当前内容页TAG标记的办法
- 盘点俄罗斯大神写的几款软件,你用过几个?最后1个是我的童年
- Linux时间戳与日期相互转换
- 产品经理必备技能之业务流程图