楼主按:如果转贴请提供原作者名和原文网址: 免翻墙实现OAUTH登陆认证,提供代码下载 http://coolder.com/547-1-1
Twitter7月1日起就停止Basic HTTP认证,采用OAuth认证,意味着用户要访问一次Twitter才能登陆,这对国外用户没问题,对国内用户就添了一道门槛,如何免翻墙实现这个认证,本人研究了好多天,放弃了好几次,今天算是完成了,也算为墙人们的翻墙事业做点贡献。
这个代码是基于“推特中文圈”1.4.1版的,“推特中文圈”的代码到 这里 下载,点 这里 下载免翻墙实现OAUTH登陆认证的代码版本1.3。
里面的类Scrape大部分取自Screen Scraping Twitter ,只是稍微改动了一下,添了个http的函数。
再简介一下使用方法,在登录页面添加一个链接按钮,指向oauth_proxy.php,在“推特中文圈”上,可以在login.php添加这么一行
< p style="margin-left:300px;">< a href="oauth_proxy.php" class="link_btn">OAuth代理登陆
然后把下载的文件解压,放在“中文圈”的根目录下。
现在有个小问题,就是如果密码或用户名错误,需要重新从login开始,如果需要,点击“退出”清理cookies。关掉浏览器,再重新启动浏览器,再登陆首页即可。
简单说就是用curl,把twitter的网页下载到服务器上,然后变化点内容再发到用户屏幕上。
变化的地方有两个:
原来要打开https://twitter.com/oauth/authenticate?oauth_token= 让输入用户名和密码的页面,现在把这个页面通过curl下载到服务器,改动一下form提交的文件名,然后通过服务器呈现给用户。原来form表单要提交给https://twitter.com/oauth/authenticate,这里改为本地的文件authenticate.php。
本地的authenticate.php接收到数据后,通过curl的post功能把数据传给https://twitter.com/oauth/authenticate,再通过curl把twitter的反馈传到服务器上,通过服务器反馈到用户的浏览器上。这样不用登录twitter就能完成OAuth认证。
补充(20100622):多亏dcshi 的提醒,发现个bug,做了修改,第一次登陆的用户需转到authenticate_2.php,再次登陆就不用了。
还要谢谢linkedin.com的几位同行,多亏他们点拨,才最后拨云见日。他们给我指出,在提交表单时的session[username_or_email]要用 $_POST['session']['username_or_email'] 来接收,是个数组Array,还给我提供了参考资料链接。
也要谢谢“推特中文圈”和山寨YouTube的作者,从他们的代码里学到很多。
Thanks them all so much。
可能有人会遇到同样的问题,所以贴过来:
Q: 试了,打开oauth_proxy.php后直接回到login.php
A: 需要点击“退出”,把cookies清空,然后关闭浏览器,再重新打开浏览器登陆,原来的那个OAuth登陆也存在这样的问题。
20100622补充:这个问题已解决。
回楼上,删除cookies后,还需要关闭浏览器,然后重新打开,如果还不行,建议到浏览器的“工具”菜单的“Internet options(选项)”,把历史纪录全部删除,关闭浏览器,再重启动浏览器。
另外,你可以到 这里 试试,页面最下面的那个“代理登陆”,我试了几次都可以的。行不行都来说一下,Good luck。
20100622补充:楼上的问题1.3版应该已经解决的。
谢谢楼上提醒,不过,我登陆时没有出现“allow/deny”,而是显示下面的界面,输入用户/密码就可以了。
dcshi @miajiao 是因为你之前已经验证了,你注册个新的帐号试下吧!记住要在需要翻墙的环境下 不要把你的vps或者ssh软件开着!这也是来自我朋友的体验!如果你在加拿大 可能没有这么恶劣的测试环境了哈!我写了个blog文:http://www.dcshi.com/?p=119
按:把dcshi的推儿转贴到这里,说的很详细,博文里把原理介绍的也很详细,再次感谢。另外,我根据她的博文把代码作了改动,放在1楼,取名1.2版。
补充:还是有问题,这个博文里的代码没有把user/password的值传给twitter,源码不知道怎么写的,因为我不知道那里的代码应该怎么下载,点右键“另存”存的是htm格式的乱码,很可能是我水平问题。
补充:又改动了一下,并测试了一下,通过 -- 因为偷懒的,1.2版没测,放在1楼,取名1.3版。