鍍金池/ 問答/Java  HTML/ 關(guān)于一個人獲得多個token的問題

關(guān)于一個人獲得多個token的問題

A在B電腦上登錄后獲得一個token,然后A又在C電腦上登錄獲得一個token,現(xiàn)在A就有兩個token了,這樣有什么辦法讓之前的token失效?否則兩臺電腦都可以登錄,主流辦法是怎么解決這個問題的?

回答
編輯回答
浪婳

token和user 一一對應(yīng)。 同一個賬戶新生成token的時候,原有的刪除了或者失效 就可以了。

2017年3月14日 20:46
編輯回答
墨小白

一般普遍的token存儲辦法就是在緩存中存儲,比如redis,好的,根據(jù)你的業(yè)務(wù)需求,其實也算是最簡單的需求了:

token='xxxxx';
// 假設(shè)拿到了user編號
userId = 3;

redis.set(token, userId);

我們設(shè)置了這個token對應(yīng)的用戶,這是最基本的?,F(xiàn)在需要拿到用戶上一次的token,那其實沒啥含量,反向設(shè)置一次即可

token='xxxxx';
// 假設(shè)拿到了user編號
userId = 3;

redis.set(token, userId);

// 找到舊的token并刪除
oldToken = redis.get('token_map_' + userId);

if (oldToken) {
  redis.delete(oldToken);
}

// 覆蓋舊的token
redis.set('token_map_' + userId, token);

還有一個方案,就是其實不需要主動刪原來的token:

token='xxxxx';
// 假設(shè)拿到了user編號
userId = 3;

redis.set(token, userId);
redis.set('current_token' + userId, token);

然后訪問接口的時候,第一步判斷token是否在redis,第二步判斷token與current_token對應(yīng)的token是否一致,一致就通過。這樣可以巧妙的拋棄原先的token。

不是復(fù)雜的賬號系統(tǒng),所以不需要過度設(shè)計

2018年8月15日 16:50
編輯回答
命于你

如果只有純粹的 jwt 的話,做不到覆蓋 token 的功能。想要 覆蓋token,需要結(jié)合 session 來達(dá)到,session 可以用 redis甚至直接就sql數(shù)據(jù)庫 去做。。。

2017年1月17日 15:37
編輯回答
解夏

當(dāng)然要后臺維護(hù)token,不然呢??

2018年1月26日 09:24
編輯回答
苦妄

要想實現(xiàn)單點登錄,必須要后臺維護(hù)token,偷不了懶的

2017年2月6日 20:11
編輯回答
傲寒

難道不是 A 登錄后直接用新 token 覆蓋掉舊 token 嗎?

user.token = newToken,這樣一來舊 Token 自然無法通過驗證。

難道你們的業(yè)務(wù)邏輯允許同一個用戶在多個地方同時登錄?

2017年5月28日 19:37