Google Gadget 登入判斷
最近因為專案上的需要,要開發一個Gadget讓使用者可以使用;Gadget其實就是用一個iframe把你的網頁嵌進去而已,沒什麼難度;你只要把宣告的xml利用My Gadget加入,就可以進行測試。
<Module>
<ModulePrefs title="hello world example" />
<Content type="html">
<![CDATA[
Hello, world!
]]>
</Content>
</Module>
唯一碰到一個不好處理的地方就是登入驗證的問題:因為在IE中iframe無法存取跨網域的cookie,所以如果有需要Session之類的東西就顯得很麻煩,雖然我們直接可以轉頁或是自己增加參數判斷,但是Gadget只要有放大縮小,他就會重新載入,這樣一來登入狀態就會掉了;不過,Google在幫你帶iframe的時候,會增加一些hash參數,這些參數可以讓我們用來判斷使用者,例如:
#st=c%3Dig%26e%3DAPu7ico1vFP/WSFEcNdM%252B0FYiw4VTydWC2kmiKzvQ9xikzwXuIlnlsQ0DIK8XlJcVcw71b9%252B5M8%252BimSJARIlZd612IAoDy1PW0RB1Krl1HOWa2B5gRkuiqKCvpsh9gMz0c7o4I1FfeoO&gadgetId=112927440424110499518&gadgetOwner=107364228776182021982&gadgetViewer=107364228776182021982&rpctoken=1954845592&ifpctok=1954845592
當然,這些參數要透過Gadget API來存取會比較方便,我們可以透過gadgetOwner或是gadgetViewer來判斷來源端的使用者,這邊提供一個小範例:
我先透過gadgets.util.getUrlParameters來取得gadgetViewer,然後回傳到我的網站,藉由這個ID來處理…
<Module>
<ModulePrefs title="我的Gadget" title_url="https://mygadget.com.tw" height="350" scaling="false" scrolling="true" description="這是說明" author="星寂" author_email="aaa@bbb.cc" screenshot="http://mygadget.com.tw/emsg280.gif" thumbnail="http://mygadget.com.tw/emsg120.gif" />
<Content type="html">
<![CDATA[
<script type="text/javascript">
var wrappedpage = "http://mygadget.com.tw/google";
function init()
{
var id = gadgets.util.getUrlParameters()["gadgetViewer"];
document.getElementById("wrapped").src = wrappedpage+ "?gadgetViewer=" + id;
document.write(wrappedpage+ "?gadgetViewer=" + id);
}
gadgets.util.registerOnLoadHandler(init);
</script>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
<iframe src="" name="wrapped" id="wrapped" width="100%" height="350px" style="border:none; margin:0; overflow:hidden; padding:0;" scrolling="no" frameborder=0 >
</iframe>
]]>
</Content>
後面我的做法就比較偷懶,因為其實只要有一個可以識別的唯一ID,其實怎麼做都可以:我的做法是把他弄成ASP.NET Session ID,這樣不管存取什麼都方便很多,而且就算回到原網站也不需要再登入一次;不過要特別注意Session ID要在global中處理,平常的Session ID可是唯讀的哦。
相關連結: