原由
一直在開發(fā)如何應(yīng)對信息過載里說到的工具Follow Center。
因為都是社交媒體的碎片內(nèi)容,沒必要端坐在電腦面前來看,隨時打開手機,時不時刷一刷,看看美女,收藏需要細看和延申閱請的內(nèi)容,這才是最有效的方式。
原網(wǎng)頁簡單做了響應(yīng)式,但用手機瀏覽器打開慢且chrome自動數(shù)據(jù)緩存記錄總會有些妨礙。
用Cordova做app,所有的js和html都打包到app里了,用起來很快。但是原本的登錄是個問題,我懶,所以要想辦法來復(fù)用原本做好的oauth,最好沒什么改動就能用。
認證持有問題
原本的網(wǎng)頁,Oauth登錄成功后,server會設(shè)置一個cookie過來,client持有cookie來標記自己已登錄了。
Cordova的app其實都是本地的文件,file://的方試來訪問的,啟用cookie不是不行,但是非常非常的麻煩,不信邪的同學(xué)自行去stackoverflow翻吧。
最后決定用Http Basic Authentication的方試來記錄已登錄,Follow Center早已啟用了https,安全方面是沒什么問題的了。
加密過的key存在localstorage里。
server的認證要對應(yīng)改一改,除了從cookie里找,還要從headers也找一找(用的是tornado,這里需要幫忙的給我留言)。
Oauth登錄跳轉(zhuǎn)問題
網(wǎng)站的Oauth的服務(wù)自然是針對一個網(wǎng)圵的,比如用github的Oauth,最后還是加上code,回調(diào)到我的網(wǎng)站的一個url上,再做后續(xù)處理。
回調(diào)是不能用本地的地圵的,且為了改動最小不影響原有網(wǎng)站功能,這一塊不能動。
所以難點主要在這里,先來理一理會遇到的問題:
- 一但點了Oauth的按鈕,進到對應(yīng)的網(wǎng)站(github qq twitter ...) 登錄,再回調(diào)回server的某個url,此時Cordova打開的已經(jīng)是外部網(wǎng)站了,再也無法訪問
file://打頭的本地資源了,這是瀏覽器一去不回頭的安全機制,出去可以,回來不行了。這樣變成直接用Codova訪問網(wǎng)站了,包app沒什么意義了。 - server 回調(diào)完成,取到了user的key,要告訴Cordova,讓其設(shè)置到localstorage里,但是怎么告訴呢?
對問題1,因為出去就回不來了,自然不能用主進程來打開Oauth,好在Cordova有個插件cordova-plugin-inappbrowser,用這個插件可以打開一個子頁,Oauth完成后關(guān)閉子頁就可以,不會出現(xiàn)出去回不來的情況。
點擊Oauth按鈕后,調(diào)用這段代碼:
function login(oauth) {
var ref = cordova.InAppBrowser.open('https://follow.center/'+ oauth, '_blank', 'location=no,hidden=yes');
ref.addEventListener('loadstop', function() {
ref.show()
ref.executeScript({ code: "secure_user_id" },
function (params) {
window.localStorage.setItem('user_id', params[0]);
ref.close();
ref = undefined;
window.location = 'index.html'
}
);
});
}
loadstop指在子頁加載完成后,觸發(fā)的事件。加上對應(yīng)的回調(diào)函數(shù)來搞定第2個問題。
ref.show()把子頁顯示出來,比如這時需要用戶輸入github的用戶名密碼來授權(quán)Oauth。
ref.executeScript指在子頁里嵌入一段js代碼,并可以又有對應(yīng)的回調(diào)函數(shù)。user的key就通過這里的辦法來傳遞回來,并設(shè)置到localStorage里。
這樣第2個問題也搞定了。
server端也要對應(yīng)改一下,檢測到是手機過來的請求,就返回帶js code的html,如果是,和以前一樣設(shè)置cookie,重定向頁面就可以了。
如果要實際試一下,可以下follow_center.apk,不過我只調(diào)通了github的oauth。