我們都知道,移動Web端(M站環境下),很多時候,前端是無法判斷用戶的登錄狀態的,因為出於安全性考慮,與賬號相關的cookie欄位一般都是 http only的。 如果前端想判斷用戶的登錄狀態,需要主動去調後臺介面,根據後臺介面返回的狀態碼來判斷。 那麼,我如果想實現下麵這樣一個場景,該怎麼做呢? ...
我們都知道,移動Web端(M站環境下),很多時候,前端是無法判斷用戶的登錄狀態的,因為出於安全性考慮,與賬號相關的cookie欄位一般都是 http-only的。
如果前端想判斷用戶的登錄狀態,需要主動去調後臺介面,根據後臺介面返回的狀態碼來判斷。
那麼,我如果想實現下麵這樣一個場景,該怎麼做呢?
移動Web端(M站環境下),游客點擊商品的收藏按鈕,登錄完成,回來之後,如何自動收藏?
方式一:在url裡加欄位
具體步驟如下:
(1)游客點擊收藏按鈕,立即調用favCommAdd的介面(假設這個是收藏商品的介面)。如果介面返回未登錄,就往重定向的url中加欄位doFavor=true
,然後去執行登錄操作。比如:
var rurl = location.href + '&isLogin=true'
favCommAdd(skuId, rurl); //調用介面。參數一表示,給指定的sku添加收藏。參數二用於登錄成功後的回跳
上面的這個rurl
參數指的是用戶登錄成功後的回跳鏈接。
(2)頁面初始化的時候,做判斷:如果當前頁面的url中包含了doFavor=true
欄位(代表用戶在上面的第一步中登錄成功),就調用FavCommAdd的介面。收藏成功。
var doFavor = url.getUrlParam('doFavor'); //這一行是偽代碼,用於獲取url中的指定參數
if(doFavor&&doFavor == 'true'){
console.log('登錄成功了');
queryAskPermission();
}
總結:方式一的這種做法存在csrf安全問題,如果我把當前頁面攜帶doFavor欄位的url鏈接轉發給別人(例如 smyhvae.com/item.shtml?sku=1234&doFavor=true
),別人點進去之後,也會去調用FavCommAdd介面。
方式二:往cookie裡加欄位
具體步驟如下:
方式二和方式一是類似的。只不過,這次,我們是在 cookie 裡加欄位,而不是在 url 裡加欄位。
具體步驟如下:
(1)游客點擊收藏按鈕,立即調用FavCommAdd的介面。如果介面返回未登錄,就往 cookie 裡加doFavor
欄位,然後去執行登錄操作。比如:
cookie.set('dofav','ok',1); //這一行是偽代碼,表示往cookie裡加自定義的欄位
(2)頁面初始化的時候,做判斷:如果當前頁面的cookie中包含了doFavor
欄位(代表用戶在上面的第一步中登錄成功),就調用FavCommAdd的介面,同時刪除這個cookie欄位。收藏成功。比如:
if (cookie.get('dofav')){ //這一行是偽代碼,表示獲取指定的cookie欄位
cookie.del('dofav');
obj.fav();
}
總結:
方式二比方式一更安全,如果把鏈接轉發給他人,他人那裡並未檢測出cookie里的指定欄位,自然也就無法調用FavCommAdd 介面。
但是,方式二依然避免不了csrf攻擊(比如說,當黑客往cookie里寫入欄位的時候)。但總的來說,方式二還算比較通用。
當然,我們還可以在方式二的基礎之上,往cookie中的欄位中加md5碼,並且要保證這個md5的時效性,那就更安全了。
如果還有其他更安全、更嚴謹的方式,歡迎交流。