セクションの場合:
1:一般的なコミュニティ着陸コンポーネント技術の共有(オープンソース)パートI:OAuthの認可着陸紹介
2:一般的なコミュニティ着陸コンポーネント技術の共有(オープンソース)小説:OAuthの着陸組立工程およびコンポーネントの統合方法
このセクションの内容:
1:プロセスの説明とコンポーネントのデザインのアイデアと、いくつかの主要なソースを説明
2:ソースのダウンロード
3:拡張メカニズムの説明
ソースコードのスクリーンショットでは:ので、次のアイデアが表示されたら、輝くを見ることができます:
A:プロセスの説明とコンポーネントのデザインのアイデア
1:なぜ招いたコンポーネントをと思いますか?
2:原則コンポーネントを設計?
2.1:ユーザーが使用したり、書き込みをするコードの量を最小限にするために、コンポーネントを呼び出すための最も簡単な方法をしてみましょう。
2.2:すべてのデザインは、2.1ポイントの下と呼ばれています。
3:単純なコンポーネント設計アイデアプロセスI:(コードの設計思想の5行)
3.1:ユーザの操作UIデザイン:
上記のチャートは、第三者が着陸を許可する方法を示し?
彼は直接デッドHTMLで書きましたか?強制的にではない感じ、そしてさらにいくつかのサードパーティが着陸するだけでなく、URLの組み合わせに拡張場合は面倒です。
だから私はこの呼び出しを容易にするために解決するために、)GetHtml(があるはず、UIのクラスがあるはずだと思います。
:UI.GetHtml()メソッドを達成
だから、私はこの設計を最適化する一般的な方法を使用しました。
{
文字列 リンク= " <a href=\"{0}\" target=\"_blank\"> <IMG SRC = \" {1} \ "/> </a>を " 。
StringBuilderのSB = 新しい StringBuilderの();
foreachの (KeyValuePair < 文字列 、OAuth2Base> OB で OAuth2Factory.ServerList)
{
場合 (! 文字列 .IsNullOrEmpty(ob.Value.AppKey))
{
sb.AppendFormat(リンク、 文字列 .Format(ob.Value.OAuthUrl、ob.Value.AppKey、System.Web.HttpUtility.UrlEncode(ob.Value.CallbackUrl)、ob.Key)、ob.Value.ImgUrl)。
}
}
を返す )(sb.ToStringします。
}
このコードは、いくつかの最適化のアイデアが含まれています。
1:あなたはライセンスの現在のすべての種類を取得することができる方法があるはずです OAuth2Factory.ServerList。
2:認可設定項目のいくつかのタイプを含める必要があり、読むことができます: ob.Value.OAuthUrl、ob.Value.AppKey、 ob.Value.ImgUrl
この方法を考え出した場合、設計がまだのOAuth2認証関連するクラスが始まっていない、それだけの擬似コードは、のOAuth2クラスが完璧であると、コードはここでのシンプルな造形で、でした。
OK、のは、振り返ってみましょう:
3.2:OAuthの認証クラスのデザイン(抽象的な+工場の伝説):
例えば、1倍などのマルチデータベースのサポートとデータベース設計のアイデア。
1:基底クラスが存在すべきである:(一般的なメソッドおよびプロパティを含む)OAuth2Base
2:その上、他のSinaWeiboOAuth、QQAuth、...と:別の認証を実装し、基本クラスOAuth2Baseを続行!
3:工場OAuth2Factoryは、(現在の設計にデータベースコンポーネントがデータベース操作の種類であるとして)現在のライセンスの種類を返すことがあります
4:小さなユーティリティクラスのツールがありますが、いくつかは、一般的に使用される小型の言い方をします。
OAuth2Factoryでは、我々は、事前に登録された認証のすべての種類を集約し、すべてのサブクラスで承認しました。
あなたがアセンブリを横断するの認可のすべての種類を取得することができGetHtmlはそう。
コード:
/// <要約> ///は、 すべてのタイプ(ここではそれを追加して登録するのOAuth2新たに開発された必要性)を取得します/// </要約> 内部は静的 辞書< 文字列、OAuth2Base>サーバリストを { GET { IF (_ServerList == NULL) { _ServerList = 新たな新しい 辞書< 文字列、OAuth2Base>(StringComparer.OrdinalIgnoreCase)。
_ServerList.Add(OAuthServer.SinaWeiBo.ToString()、 新 SinaWeiBoOAuth()); // 新浪微博
_ServerList.Add(OAuthServer.QQ.ToString()、 新 QQOAuth()); // QQ微博
}
リターン _ServerList。
}
}
全体的なデザインは限り達成するために、あなたは承認を得るため、およびサードパーティのトークンと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
ます。https://my.oschina.net/secyaher/blog/274382で再現