Archive for February, 2006

Web2.0 , SSO & OpenID

Web2.0的应用越来越多,对SSO的需求也就愈发强烈,Delicious,Flickr,Mail,Blog,43things, Feedburner……,每个应用都有自己的一套Identit需要维护,这带来了很多问题,比如: 每个应用都需要注册一个用户名和密码 每天需要输入很多次同样的认证信息 可能无法注册到自己希望的用户名 如果这些Web2.0应用能够采用某种Single Sign-On系统,会带来很多好处: 简化Web2.0的开发,不需要开发Identity认证,只需要集成SSO的SDK 用户只需要记住一个简单的Identity就可以 统一认证,方便集成各种Web2.0的应用 BTW:这里需要分清Authentication与Authorization的区别:SSO负责的仅仅是Authentication – is proving that You Are Who You Say You Are,Authorization则是某个Identity在这个应用系统中有什么数据,这是Web2.0网站自己的事儿。 最先想到的是Microsoft Passport,它的基本工作原理是: 1) 客户端对Passport合作站点(比如MSN Space)发出访问请求,检查Cookie是否有Passport登陆验证的Cookie,如果没有,则显示"登陆"按钮; 2) 点击登陆按钮,Redirect -> Passport.com 进行验证,参数: returnUrl – 返回到应用的URL SiteID – 合作站点的ID 3) Passport检查客户端Cookie,如果用户未登陆(用户有可能在其它的Passport-Enable站点登陆过),则显示登陆页面;如果登陆过,则更新Cookie,到(5); 4) 用户提交登陆数据(用户名、密码,有时还图像验证等),HTTPS发送; 5) Passport验证用户身份,生成sid,重定向回刚才传递的那个returnUrl,也就是Passport的应用站点。 6) Passport合作站点通过预先约定验证SID,并生成本地Cookie,显示"登出"按钮。 其实,类似的SSO方案还有很多,有跨网站应用的,比如Sixapart的Typekey;也有本公司的Passport,比如Sohu Passport(Sohu Passport的认证页面是通过HTTP明文传的…),还有为了其它应用集成的,比如Flickr API中的认证。 这种SSO解决方案中最重要的三个元素为: SiteID – 标识哪个合作应用站点 ReturnURL [...]

Dissect Spam Karma

Spam Karma是一个非常棒的WP插件,用来过滤WP的留言中的Spam。用过WP的朋友或多或少的都受到过Spam疯狂的攻击,SK可以很大程度上的帮助你从这种困境中解脱出来。 Karma ['ka:ma] – 卡马(镍铬丝精密级),是一种度量单位。SK中,用Karma来表示一个留言的"Spam等级",最后根据一个留言的Karma值来判定这个留言是不是Spam。 Update:Ben提醒Karma的另一个意思是佛教中的”因果报应”,也许,这个意思更符合作者的本意。 SK本身是一个WP的插件,而为了有更好的扩展性,SK2也是采用插件的形式来工作的。当然,它的插件工作比起WP的机制来说,简单很多。 Plugin Framework大概有几种模式: 一种如Eclipse那样,采用"微内核+插件"。除了一个微小的核(包括Plugin Framework)之外,其它任何东西都是插件。这就需要尽可能的多留出扩展点,每个插件在做的时候要时刻考虑别人可能从哪个地方来扩展。 一种如Firefox、WordPress这样,主程序相对独立,在独立Standalone程序的基础上,暴露出一些接口,这种扩展性也非常强,当然,这是建立在StandAlone程序暴露出了足够丰富的扩展点的基础上。 这两种都有非常丰富的扩展性,比较适合做大型的Framework,比如Eclipse RCP等等。另外,这两种模式中往往都有"Extension Point"的概念。 另一种方式就简单多了,系统规定好几个Interface,插件只需要实现这几个Interface即可。这样的插件Framework,实现起来比较简单,但是扩展性也非常有限,比较适合做比较专用的小型程序。这种插件的核心概念就是"Interface"。 SK2就是一个这样的例子。 先来看看SK扩展WP的部分: SK Extend了以下几个Extension: <?php add_action(‘comment_form’, ‘sk2_form_insert’); add_action(‘admin_menu’, ‘sk2_add_options’); add_action(‘admin_head’, ‘sk2_output_admin_css’); add_filter(‘pre_comment_approved’, ‘sk2_fix_approved’); add_action(‘comment_post’, ‘sk2_filter_comment’);   add_action(‘wp_footer’, ‘sk2_insert_footer’, 3); ?> 其中,"admin_menu"是用来在菜单中添加一个Option选项,"admin_head"是在Head中添加SK自己的CSS信息,"wp_footer"是在Blog的尾部添加一个SK的Copyright信息。 其余的三个就比较重要了 Extend "comment_form" Extension的是函数"sk2_form_insert",顾名思义,是在Comment Form Load的时候添加代码。 "pre_comment_approved"是一个Trick,防止WP自动发送Comment Notification。 "comment_post"是最重要的一个扩展点,它是在一条Comment被提交之后来调用的,SK的处理也正在此处。 再来看看SK2插件,前面说过它是属于比较简单的第三种形式,看看它的Interface是怎么定义的: 这个类中有三个核心的接口函数分别是 <?php     function filter_this(&$cmt_object)     [...]

coComment Preview

一直希望有一个很好的Comments解决方案,帮我解决以下几个问题: 帮我追踪我所有的留言,记录这些留言的痕迹; 更进一步的追踪这些留言的Post,来看看Blog的主人对我的留言有什么反馈。 有一段曾经用Trackback来解决问题,这样做的结果是只有长篇大论才被记住,很多一两句的留言就不自觉地放弃了,反正也无法跟踪反馈 。久而久之,积极性越来越低,已经很少留言了。 Herock曾经建议采用社会化书签来对留言进行统一管理,可是关键在于,Bookmark下这些URL只是一些静态的信息,留言的组织和追踪还是靠你自己,还是很麻烦。 这两天偶尔看到coComment这个服务,看起来能够帮我解决我所面临的问题,就想试试。昨晚留下了Email,没想到一早就收到了invitation code。 用起来说简单也简单,说复杂也复杂,需要你在Browser中添加一个Bookmarklet,在点击留言提交的按钮前,点击这个Bookmarklet,然后点击的时候就同时把留言提交到coComment去了。 简单看了一下它的Bookmarklet代码,发现它是根据各种Blog系统的特征找到Comments的Form,然后在这个Form的提交Button后面添加一个个人信息的Logo,然后在修改Form的提交部分,让留言同时提交到coComments去。 看了一下代码,现在支持的Blog系统包括: xanga.com myspace.com msn.com blogger.com typepad blogs.com wordpress.com kaywa.com 这种做法够Hack的,不过想想也没办法。本来最好的办法是弄一个标准,然后大家都按照这个标准把留言Ping到某一个服务,不过,这似乎是不可能的,于是,就Hack这个提交的Form了。 不过,这种太过Geek的做法能够被普通用户所接纳么?我很担心。 最后的Conversation组织的不错,Fancy,而且也提供RSS来让我追踪我留言的各条Post,目前还没有收到更新,只能看看再说了,呵呵。对了,还提供Share的功能,把自己的留言Share出来。 还有,就是要提两个意见: 能不能做的更彻底一点儿,点击这个Bookmarklet的时候能自动帮我填留言的Form呢?我指的当然是Name,Blog这些信息,可以把它存在coComments的帐户里面。 把针对各种Blog系统的模版尽量抽象,然后提供一个可以方便扩充的Plugin机制(或者叫做Provider,Add-on),毕竟,coComments根本没精力提供所有系统的Comments模版,可以把这些工作留给社区来做,比如,吉子就可以做一个针对Sohu Blog的,嘿嘿。 Update: 简单测试了一下,发现coComment只能追踪同样是通过coComments服务的留言,不爽,不过也没有太好的办法,除非各家都提供自己的Comments RSS; 昨天用的时候就像可以写一个GreaseMonkey的脚本,来自动干这件事儿,结果这不,今儿就有了,这下更方便了; 还有一点想说的就是,这个服务的一个让我用的原因就是他不会让你失去什么,你的留言只是拷贝了一份在他那儿,所以,得到的就算是赚得吧。

IE7 Beta2 Preview

距离上次装Beta1已经有半年的时间了,这半年,用IE的时间大大的增加,不舍Firefox的主要原因是开放的架构和丰富的插件。 昨晚装上了IE7 Beta2试了试(这回也是英文版,不过不需要像上次那样Hack了:P),注意到一些细小的地方,比如: 上次的CSS Fixed的问题得到了解决; Tab上的Close按钮(据说这是得到了Blog中的反馈而加上的功能); Alt键开/关菜单; Quick Tabs预览,这个太Cool了(估计Firefox会很快出来类似的插件吧); "Delete Browse History"(虽然是已有功能的汇总,不过这个功能应该会有很多人需要); Full Screen的处理非常好,比Firefox的处理更加方便和人性化; Search Engine中默认为MSN Search,不过可以很方便的设置为Google或者其它; Native XMLHTTPRequest Object的支持,这样,今后写AJAX代码不用再区分浏览器了。 最让我印象深刻的是IE Blog这次的宣传攻势: Native XMLHTTPRequest object – IE7中对XMLHTTPRequest的Native支持 Frequently Asked Questions for the IE7 Beta 2 Preview – IE7中的常见问题 Windows RSS Platform – RSS的支持,期待API的公开 Security issue in IE7? – 第一个漏洞? A New Look for IE – [...]

First glance at Ruby

大年三十的时候,上班已经没什么事儿了,就仔细读了读以前保存的很多不错的文章,包括这一篇"Ruby, PHP and a Conference",作者是大名鼎鼎的Bruce Eckle,"Thinking in Java"这个经典教材的作者。 一直就很想看看Ruby这个很火的语言,这两天终于有些时间,就找了一些文章看了看。 强烈推荐一篇"10 Things Every Java Programmer Should Know About Ruby",挺不错。 总结一下Ruby吸引我的地方: 1) Case Statement In Ruby, the case statement can match with any object. It uses the “===” method in Object to perform the match, which can be overridden for your own classes. Since everything is really [...]