引用说明:原文来自于http://djb4ke.iteye.com/blog/654426,为了方便本人阅读,文本格式略有调整。
Apache Shindig homepage
实验0:Shindig初体验
部署应用:
1:下载最新的war包
http://shindig.apache.org/download/index.html
(目前版本http://repo2.maven.org/maven2/org/apache/shindig/shindig-server/1.1-BETA5-incubating/shindig-server-1.1-BETA5-incubating.war)
2:将war包copy到 $TOMCAT_HOME/webapps下
3:修改$TOMCAT_HOME/conf下的server.xml文件
(此步骤必须做,因为Shindig调用一些内部的 API,URL都是访问域的根目录):
找到<HOST/>节点,添加<Context docBase="shindig-server-1.1-BETA5-incubating" path="" workDir="work\Catalina\localhost\shindig-server-1.1-BETA5-incubating" reloadable="true"/>
4:启动tomcat后,打开浏览器测试一下:http://localhost:8080/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml
效果如下:
5:有了gadget容器,我们可以尝试着render各种gadget
下面的网址是个gadget的目录,view details后copy gadget的xml源代码附加到http://localhost:8080/gadgets/ifr?url=后面。
http://directory.opensocial.org/gadgets/directory?synd=cad
这里贴几个我试验过的gadget:
http://www.labpixies.com/campaigns/sudoku/sudoku.xml&source=lpep
http://graargh.returnstrue.com/lane/opensocial/v09/mashup/gifts.xml
http://hosting.gmodules.com/ig/gadgets/file/100080069921643878012/myspace.xml
http://warmbrain.com/gadgets/flickr.xml
实验1:下载最新的Build包进行编译运行调试
参照官网build新包和设置了Eclipse编译环境
http://shindig.apache.org/developers/java/build.html
Java version: 1.6.0_17
Java home: C:\Program Files\Java\jdk1.6.0_17\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7" version: "6.1" arch: "x86" Family: "windows"
编译源代码:mvn
<maven.compile.deprecation>off</maven.compile.deprecation>
简单介绍:这里打开的debug端口是8000,suspend为no时,除非debug断点中断,如果没有调试器设置断点,server运行与普通运行时一样
※关于maven参数的ref:https://cwiki.apache.org/WICKET/maven-jetty-plugin.html
运行Jetty服务器 : mvn -Prun
- 为了方便Debug,设置mvn参数:MAVEN_OPTS:-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
- Eclipse 安装 maven2插件地址更新 http://m2eclipse.sonatype.org/sites/m2e
- 别用插件,不好用,直接本地maven编译完后,用mvn eclipse:eclipse推过去就行了
- 最简洁步骤:
- 从svn download src
- mvn编译 mvn
- mvn -Prun测试
- mvn eclipse:eclipse
- eclipse new project -> creat project from exist src ->将tomcat的几个lib加进来
- http://rollerweblogger.org/roller/entry/shindig_java_internals_diagram_updated 讲解shindig Java实现的内部机制
- Test url
- http://localhost:8080/container/sample1.html
http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.html
Container:
http://localhost:8080/samplecontainer/samplecontainer.html
OpenSocial Dev App (hyves):
http://osda.appspot.com/gadget/osda-hyves.xml
Google calendar
http://www.google.com/ig/modules/calendar3.xml
http://localhost:8080/gadgets/ifr?url=http://www.google.com/ig/modules/calendar3.xml
中国Containter List
http://wiki.opensocial.org/index.php?title=Resources_for_migration_to_Chinese_containers
Social Site
http://incubator.apache.org/projects/socialsite.html
两篇很有价值的问题,探讨Opensocial结合OAuth的应用:
这个应用很独特,在Social Network中,比如Facebook,添加一个Gadget后(假设javaeye支持),可以在facebook中通过这个Gadget可以得到javaeye blog的Data,可以发文章到javaeye。
http://rollerweblogger.org/roller/entry/oauth_everywhere
http://rollerweblogger.org/roller/entry/oauth_everywhere_continued
需要关注的web应用
http://www.ning.com
Enable OAuth in Shindig
https://cwiki.apache.org/confluence/display/SHINDIG/Enabling+OAuth+support
实验:在Shindig上跑OAuth,Gadget访问Shindig
为了跑完整的OAuth流程,我们需要在Server端保存gadget的key和secret
打开文件 %SHINDIG_ROOT%/target/work/webapp/WEB-INF/classes/config/oauth.json
这个文件就是OAuth的配置文件,因为我们要run的是Shindig默认的OAuth例子,所以这里已经定义好了,如果以后要自己要添加在,仿照着加进去即可。
"shindig" : {
"consumer_key" : "http://localhost:8080/samplecontainer/examples/shindigoauth.xml",
"consumer_secret" : "secret",
"key_type" : "HMAC_SYMMETRIC"
}
}
同时,我们还需要生成server端自己的key:
Step1:到链接处下载Openssl,http://www.slproweb.com/products/Win32OpenSSL.html
Step2:用下面两个命令可以生成key
openssl req -newkey rsa:1024 -days 365 -nodes -x509 -keyout testkey.pem -out testkey.pem -subj '/CN=mytestkey'
openssl pkcs8 -in testkey.pem -out oauthkey.pem -topk8 -nocrypt -outform PEM
ey.pem -out testkey.pem -subj '/CN=mytestkey'
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.....++++++
........................++++++
writing new private key to 'testkey.pem'
-----
Subject does not start with '/'.
problems making Certificate Request
C:\OpenSSL\bin>openssl pkcs8 -in testkey.pem -out oauthkey.pem -topk8 -nocrypt -
outform PEM
Step3:编辑SHINDIG_ROOT/java/conf/shindig.properties文件
为shindig.signing.key-name和shindig.signing.key-file属性赋值
shindig.signing.key-file是你存放oauthkey.pem的位置。
### Outbound OAuth support
shindig.signing.state-key=
shindig.signing.key-name=mykey
shindig.signing.key-file=C://OpenSSL//bin//oauthkey.pem
shindig.signing.global-callback-url=http://localhost:8080/gadgets/oauthcallback
shindig.signing.enable-signed-callbacks=true
........
保存后需要重新编译shindig,比较清爽的做法:
step1 : mvn clean
step2 : mvn(或者可以忽略test,用mvn -Dmaven.test.skip=true)
编译完成后启动Shindig
mvn -Prun
oauth.xml
打开浏览器:
进入Shindig默认测试container:http://localhost:8080/samplecontainer/samplecontainer.html
在Displaying gadget输入: http://localhost:8080/samplecontainer/examples/shindigoauth.xml
点击reset all后会render出gadget。
点击Button后会进行Oauth的flow.
问题:Gadget的OAuth参数实在何处保存的:
从表面来看,这仿佛是gadget和SHINDIG两者间的交互。
但是如果稍微深入想想,Gadget被Render出来后只是HTML,不通过server,怎么能发出OAuth这么复杂的request呢,而request当然也不可能是被Gadget正在访问的服务发的(自己验证自己多没意义╮(╯_╰)╭)。那这到底是怎么做的呢?
所以提出这个问题的原因是,如果没仔细看过spec,如果也没觉得费解,就会产生两者在交互的误解。
而且此时的环境是我单独运行的Shindig,用的gadget也是shindig自带的,似乎一切都在shindig中完成,并没有OAuth中consumer和service provider的概念,如果不把Gadget当做cousumer,就更加费解了..
为了说明这个问题,首先引入Shindig OAuth的Flow
Host: 127.0.0.1:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/5.0.335.1 Safari/533.1
Referer: http://127.0.0.1:8080/gadgets/ifr?container=default&mid=0&nocache=0&country=ALL&lang=ALL&view=default&parent=http%3A%2F%2Flocalhost%3A8080&st=john.doe%3Ajohn.doe%3A6114%3Ashindig%3Ahttp%253A//localhost%253A8080/samplecontainer/examples/shindigoauth.xml%3A0%3Adefault&url=http%3A%2F%2Flocalhost%3A8080%2Fsamplecontainer%2Fexamples%2Fshindigoauth.xml
Content-Length: 521
Origin: http://127.0.0.1:8080
Content-Type: application/x-www-form-urlencoded
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: __utmz=96992031.1272262237.1.1.utmcsr=localhost:8080|utmccn=(referral)|utmcmd=referral|utmcct=/samplecontainer/samplecontainer.html; __utma=96992031.311100061.1272262237.1272262237.1272262237.1; __utmv=96992031.container%2Fshindig
POST Data:
url http://localhost:8080/social/rest/people/@me/@self
st john.doe:john.doe:6114:shindig:http%3A//localhost%3A8080/samplecontainer/examples/shindigoauth.xml:0:default
signViewer true
signOwner true
postData
OAUTH_SERVICE_NAME shindig
oauthState
numEntries 3
httpMethod GET
headers
getSummaries false
getFullHeaders false
gadget http://localhost:8080/samplecontainer/examples/shindigoauth.xml
contentType TEXT
container default
bypassSpecCache 0
authz oauth
Authorization: OAuth oauth_callback="http://localhost:8080/gadgets/oauthcallback?cs=DrcUT0ehRxQ0NOrOWaX1W8R5FTVx1nhYmIPjbsVN8rqayhBlVACrTEzM%2F31RZAhsgHGjulkPfcEeC5ohKK%2BFRJseFhIWoNm5RLO%2FS524PnbPzgEswAITYX0dGHAAL8D5hNAVfpyjCuwN%2BK2F3MwddjBjRbI%3D",
opensocial_owner_id="john.doe",
opensocial_viewer_id="john.doe",
opensocial_app_id="6114", opensocial_app_url="http://localhost:8080/samplecontainer/examples/shindigoauth.xml",
oauth_version="1.0",
oauth_timestamp="1272366999",
oauth_consumer_key="http://localhost:8080/samplecontainer/examples/shindigoauth.xml",
oauth_signature_method="HMAC-SHA1",
oauth_nonce="97398594831985",
oauth_signature="/TMZ0kErj5W0v1YzuieRxzN3rdE="
X-shindig-dos: on
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache Shindig
Content-Type: text/plain
Expires: Tue, 27 Apr 2010 11:16:39 GMT
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 134
Server: Jetty(6.1.22)
oauth_token=b57e1ba2-9eb7-49aa-8a44-89ccf4d6cace&oauth_token_secret=f615ed6a-2fc3-45d9-92bf-9b57a7f1f935&oauth_callback_confirmed=true
Gadget