[.NET][OAuth Series] EasyOAuth Library: 容易使用且可扩充的 OAuth Library

这是笔者的第三个 Codeplex 开放源代码项目,承继前面四篇 OAuth Series 文章的说明,EasyOAuth Library 建构于 .NET Framework 之上,并且可以很容易的将 OAuth 的功能套用到自己的 .NET 应用程序中,并且开发人员可以依照 EasyOAuth Library 开放的界面,为非内建的 OAuth Service Provider 开发界面,以在 EasyOAuth Library 中直接使用。


这是笔者的第三个 Codeplex 开放源代码项目,承继前面四篇 OAuth Series 文章的说明,EasyOAuth Library 建构于 .NET Framework 之上,并且可以很容易的将 OAuth 的功能套用到自己的 .NET 应用程序中,并且开发人员可以依照 EasyOAuth Library 开放的界面,为非内建的 OAuth Service Provider 开发界面,以在 EasyOAuth Library 中直接使用。

EasyOAuth Library 支持 Google Account, Facebook, Twitter 以及 Yahoo 四种 OAuth Service Provider 的验证与授权功能,分别内建于 OAuth.Desktop 与 OAuth.Web 两个函数库中,分别是 GoogleOAuthProvider, FacebookOAuthProvider, TwitterOAuthProvider 与 YahooOAuthProvider 四个类,它们有自己的 Configuration 机制,并且可以一次在同一个应用程序中使用不同的 OAuth Service Provider 进行认证与授权。同时,授权取得的认证码 (access token) 会自动保存在 OAuthAccessTokens.dat 文件中,这个文件是一个 XML 的文件。

目前笔者首先释出 Desktop Application 版本的 EasyOAuth Library,未来会再释出 Web Application 版本的 EasyOAuth Library。

首先,请到 http://easyoauth.codeplex.com 下载 Desktop Application 的 Binary code,并且加入参考到桌面应用程序 (可以是 Console application 或 Windows Forms application),然后在 app.config (如果项目中没有的话要加) 中加入下列声明:



然后,加入下面的 EasyOAuth 组态设定:



  
  
  
  
  


  
  

这些组态设定定义了 OAuth Service Provider 的认证行为,包含应用程序的金钥 (consumerKey),密码 (consumerSecret),授权界面 URL (consentUrl),要求授权 URL (requestTokenUrl) 以及要求存取 URL (requestAccessTokenUrl) 等设定,如果 OAuth Service Provider 没有变动的话,基本上 URL 可以不用改。

组态设定好后,只要在程序中引入 OAuth 命名空间:

using OAuth;

然后使用 OAuthContext 对象,即可操作 OAuth 的流程:

OAuth.OAuthContext context = new OAuth.OAuthContext();
string userID = "1111"; // 这个可由开发人员自订,在多使用者的情况下,识别该使用者的 access token。

try
{

    if (!context.IsAccessTokenValid(userID))
   {
       context.ObtainRequestToken();
       context.ObtainVerifier();
       context.ObtainAccessToken();
       context.PersistAccessToken(userID);
   }
   else
       context.LoadAccessToken(userID);

    Console.WriteLine(context.Provider.PerformRequest("http://gdata.youtube.com/feeds/api/videos/"));
}
catch (OAuth.OAuthUnauthorizedException ue)
{
   Console.WriteLine("HTTP 401");
   Console.WriteLine("Signature: " + ue.Signature);
   Console.WriteLine("base_string:" + ue.SignatureBaseString);
   Console.WriteLine("Response: " + ue.ResponseDataString);
}
catch (OAuth.OAuthNetworkException ne)
{
   Console.WriteLine("Network Problem");
   Console.WriteLine("Response: " + ne.ResponseDataString);
}
catch (Exception e)
{
   Console.WriteLine(e.Message);
   Console.WriteLine(e.StackTrace);
}
finally
{
   context = null;
}

这段范例程序会存取 Google Account,若程序发现目前没有授权时,会执行 context.ObtainRequestToken() 与 context.ObtainVerifier() 进程,此时使用者应该会看到一个要求授权的对话盒:

image

当使用者授予权限时,会看到:

image

使用者需要将画面上的授权码 (每个 Service Provider 的画面会不太一样) 贴到下方的授权码文字框,然后按下 [授予存取],接着 OAuthContext 就会执行 ObtainAccessToken() 取得存取码,最后将存取码保存在 OAuthAccessTokens.dat 文件中,下次若仍是同一个使用者存取时,就直接参考在 OAuthAccessTokens.dat 文件的存取码直接存取。

目前 EasyOAuth Library 已经实践了完整的 OAuth 认证与授权流程,但并未包含存取这些服务的 Private APIs,因此如有这个需求的开发人员,可以参考这篇文章,以使用 access token 存取 Private APIs,未来可能笔者也会释出针对这些 Service Provider 的 API 存取的 Library (我只说可能哦…)。