我們都知道,移動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的時效性,那就更安全了。
如果還有其他更安全、更嚴謹的方式,歡迎交流。