[OAuth Series] EasyOAuth Framework 2.0 Desktop and Web Edition

继今年四月份的 EasyOAuth Framework 1.0 上架到 Codeplex.com 后,除了再检视程序本身以外,还吸取一些来自社群的意见 (虽然不多...),以及配合 Windows Live ID 支持 OAuth 2.0 规格的发表,EasyOAuth Framework 也顺势改版到 2.0,同样支持 Desktop Edition 与 Web Edition,可供桌面应用程序与 Web 应用程序的 OAuth 认证机制开发功能。


继今年四月份的 EasyOAuth Framework 1.0 上架到 Codeplex.com 后,除了再检视程序本身以外,还吸取一些来自社群的意见 (虽然不多...),以及配合 Windows Live ID 支持 OAuth 2.0 规格的发表,EasyOAuth Framework 也顺势改版到 2.0,同样支持 Desktop Edition 与 Web Edition,可供桌面应用程序与 Web 应用程序的 OAuth 认证机制开发功能。

EasyOAuth Framework 2.0 相对于 1.0 版有一些改变:

1. 重构整个程序,将不必要的程序移除与整并,并将 OAuth 1.0 与 2.0 的用户端程序浓缩成基础的类,也就是 EasyOAuth.Core.OAuthDesktopClientV1 (Web: OAuthWebClientV1) 与 EasyOAuth.Core.OAuthDesktopClientV2 (Web: OAuthWebClientV2) 两个类,搭配 Configuration 组态档以串接完整的 OAuth 认证与授权流程,但所需的程序却很少:

// v1.0
context = new OAuthContext("Facebook");

context.ObtainRequestToken();
context.ObtainVerifier();
context.ObtainAccessToken();

Console.WriteLine("access token=" + context.Provider.GetDataRepository().Token);


// v2.0
EasyOAuth.Core.OAuthDesktopClientV1 client = EasyOAuth.Core.OAuthDesktopFactory.CreateProviderForOAuthV2("facebook");
client.VerifyAuthentication();
Console.WriteLine("access token=" + client.Token);

2. 组态档配合 2.0 的改版做调整,让它更阶层与明确化:


 
  




  
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          isVerifyCodeRequiredInDesktopMode="true" />
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          isVerifyCodeRequiredInDesktopMode="true"
          scope="http://www-opensocial.googleusercontent.com/api/people/">
      
        
        
        
        
      

    

               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          isVerifyCodeRequiredInDesktopMode="true" />
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          isVerifyCodeRequiredInDesktopMode="true" />
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          isVerifyCodeRequiredInDesktopMode="true" />
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          isVerifyCodeRequiredInDesktopMode="true" />
  

  
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          scope="publish_stream,read_stream,email,offline_access" />
               consumerkey="[Consumer Key]"
          consumersecret="[Consumer Secret]"
          scope="publish_stream,read_stream,email,offline_access" />
  



  

保留组态档的目的,是为了保持扩充的弹性,如果需要使用到不属于内建的提供者的 OAuth Service Provider 时,可以透过组态档来设定。

3. 支持 8 个主流的 OAuth Service Provider,包含 Google, Facebook, Twitter, Yahoo, Linked In, Dropbox, Plurk 与 Windows Live ID 等,且以 EasyOAuth.Providers 组件提供内建的支持,并且同时支持 Desktop 与 Web,不用再像 v1.0 版时还要分开加入参考,而且如果使用内建的 Provider,可以在不设定组态档的情况下直接使用:

EasyOAuth.Providers.Desktop.GoogleClient client =
   EasyOAuth.Providers.OAuthDesktopProviderFactory.CreateOAuthClient(
   "[consumer key]", "[consumer secret]", "[scope]");

client.VerifyAuthentication();
Console.WriteLine("access token=" + client.Token);

也就是说,如果只要用到内建的 OAuth Service Provider,则只要使用 EasyOAuth.Providers.dll 中提供的类即可,但若要用到额外的 OAuth Service Provider,则可以使用 OAuthDesktopClient 或 OAuthWebClient 配合组态档的设定来存取。

4. EasyOAuth Framework 2.0 的 Web 实践有一部分变更,在 EasyOAuth.WebUtility.dll 中封装了 OAuthVerifyHandler 类,它是一个 HTTP Handler,要先将它注册到 Web.config 中成为一个处理常式,它会作为 Callback 的处理常式,所以在 OAuth Service Provider 如果需要 callback URL,要记得把这支处理常式的 URL 提供给 OAuth Service Provider。而 Web Application 这里使用的是 OAuthClientContext 对象,并调用 BeginAuthentication() 触发认证:

// 注解掉的这个用法也可以,但为了展示使用内建 Provider 的能力,所以先注解掉本行。
//EasyOAuth.WebUtility.OAuthClientContext oauthContext =
//    EasyOAuth.WebUtility.OAuthClientContext.Create(EasyOAuth.Core.OAuthWebFactory.CreateProviderForOAuthV1("google"));

EasyOAuth.WebUtility.OAuthClientContext oauthContext =
   EasyOAuth.WebUtility.OAuthClientContext.Create(
   EasyOAuth.Providers.OAuthWebProviderFactory.CreateOAuthClient("google"));

try
{
   oauthContext.BeginAuthentication();
}
catch (OAuthNetworkException one)
{
   this.labelError.Text = one.Message;
   this.labelResponseText.Text = one.ResponseDataString;
   this.labelOAuthHeader.Text = one.OAuthHeader;
}
catch (OAuthException oe)
{
   this.labelError.Text = oe.Message + " - " + oe.InnerException.Message;
}

然后再于 Web.config 中设定 Web 要使用的 acceptedRedirectUrl (认证通过时要导向的网页) 与 failedRedirectUrl (认证失败时要导向的网页):



  




  
  
     ....
  

  
     ....
  


  
  


  
               verb="GET" type="EasyOAuth.WebUtility.OAuthVerifyHandler, EasyOAuth.WebUtility" />
  

就完成了使用 EasyOAuth Framework 2.0 Web Edition 的设定了,最后只要在 acceptedRedirectUrl 的网页中使用下列程序,即可取得 access token:

this.labelAccessToken.Text = EasyOAuth.WebUtility.OAuthClientContext.Current.Token;

EasyOAuth Framework 2.0 Web Edition 的测试公开网址在 http://www.studyazure.com (暂行的):

image

当认证完成时,可以看到 access token 的值:

image

4. 暂时移除自动保存 access token 的功能,因为个人觉得这个功能写的有点烂,而且好像很容易误解,所以先移除。等到 2.0 SP1 时再加回去。

EasyOAuth Framework 2.0 Desktop and Web Edition 一样可以由 http://easyoauth.codeplex.com 下载,这个版本应该是不会再变了,日后的 OAuth 相关的功能应该就是以这个为基础向上开发。如果用起来有什么样的意见或看法,也欢迎 feedback 给我或在 EasyOAuth 的 Codeplex 网站讨论区上留言。