一般的想法是,你想在Firebase中創建一些元數據,告訴你有多少位置用戶已登錄。那麼你可以使用這些信息限制他們的訪問。
要做到這一點,您需要生成自己的令牌(以便信息可用於您的安全規則)。
1)生成令牌
使用custom login生成自己的令牌。每個標記應該包含一個唯一的ID爲客戶端(IP地址UUID?)
var FirebaseTokenGenerator = require("firebase-token-generator");
var tokenGenerator = new FirebaseTokenGenerator(YOUR_FIREBASE_SECRET);
var token = tokenGenerator.createToken({ id: USER_ID, location_id: IP_ADDRESS });
2)使用存在於存儲用戶的LOCATION_ID
退房有關詳細信息,managing presence底漆:
var fb = new Firebase(URL);
// after getting auth token back from your server
var parts = deconstructJWT(token);
var ref = fb.child('logged_in_users/'+token.id);
// store the user's location id
ref.set(token.location_id);
// remove location id when user logs out
ref.onDisconnect().remove();
// Helper function to extract claims from a JWT. Does *not* verify the
// validity of the token.
// credits: https://github.com/firebase/angularFire/blob/e8c1d33f34ee5461c0bcd01fc316bcf0649deec6/angularfire.js
function deconstructJWT(token) {
var segments = token.split(".");
if (!segments instanceof Array || segments.length !== 3) {
throw new Error("Invalid JWT");
}
var claims = segments[1];
if (window.atob) {
return JSON.parse(decodeURIComponent(escape(window.atob(claims))));
}
return token;
}
3)添加安全規則
在安全規則,強制執行,只有當前獨特的地理位置可以讀取數據
{
"some_restricted_path": {
".read": "root.child('logged_in_users/'+auth.id).val() === auth.location_id"
}
}
4)logged_in_users
你要設置控制對logged_in_users寫訪問的某些系統控制的寫訪問。顯然用戶應該只能寫自己的記錄。如果您希望第一次登錄嘗試始終獲勝,那麼使用".write": "!data.exists()"
時,如果存在值(直到他們註銷),請防止寫入但是,通過允許最後一次登錄獲勝可以大大簡化,在這種情況下,它會覆蓋舊的位置值和以前的登錄將失效並且無法讀取。
5)這不是一個解決方案來控制你不能使用該功能防止多向並行註解你的火力地堡並行註解
的數量。請參閱goOffline()和goOnline()以獲取更多有關完成此操作的數據(或者獲得付費計劃,以免對連接造成困難)。
打開新選項卡仍被視爲同一瀏覽器會話。我不認爲你可以做到這一點,而無需將用戶從兩個選項卡中刪除。您可以處理不同的瀏覽器。 – jammykam
謝謝jammykam,我可以在同時進行的會話中打開兩個選項卡。但是兩個不同的瀏覽器(在兩臺不同的計算機上)就是我想要避免的。 – jdchizzle