在Cordova開發(fā)的app里復(fù)用web Oauth登錄功能

原由

一直在開發(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)站功能,這一塊不能動。
所以難點主要在這里,先來理一理會遇到的問題:

  1. 一但點了Oauth的按鈕,進到對應(yīng)的網(wǎng)站(github qq twitter ...) 登錄,再回調(diào)回server的某個url,此時Cordova打開的已經(jīng)是外部網(wǎng)站了,再也無法訪問file://打頭的本地資源了,這是瀏覽器一去不回頭的安全機制,出去可以,回來不行了。這樣變成直接用Codova訪問網(wǎng)站了,包app沒什么意義了。
  2. 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,939評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評論 19 139
  • 我喜歡在朋友面前有優(yōu)越感,因為心中有了一臺秤。如今這種感覺已經(jīng)逐漸離我而去,吞噬我的是那些所謂的自卑感。這又從何而...
    酷酷酷666閱讀 217評論 0 0
  • 這幾天被戰(zhàn)狼刷屏了,占了題材和所表達的主旋律精神的便宜,各大主流媒體天天免費推送,我若不是因為偶爾看看人...
    念航閱讀 326評論 0 0

友情鏈接更多精彩內(nèi)容