2014-01-23 211 views
5

我希望新的會議基本上「註銷」任何以前的會話。例如,當您在一臺計算機中進行經過身份驗證的會話時,在另一臺計算機上啓動新會話並使用我們的應用上的Firebase進行身份驗證時,會在第一臺計算機上註銷其他會話。如何防止同一用戶同時登錄Firebase?

我一直未能找到任何方法讓我「遠程」退出會話。我知道我可以在會話中使用unauth()和goOffline()。但是,如何從同一用戶的不同身份驗證會話中執行此操作?

感謝您的幫助!

背景資料:

  1. 我使用簡單的電子郵件/密碼登錄的火力認證
  2. 我沒有安全規則設置的是,雖然這是在作品
  3. 我m使用JavaScript和Firebase
+0

打開新選項卡仍被視爲同一瀏覽器會話。我不認爲你可以做到這一點,而無需將用戶從兩個選項卡中刪除。您可以處理不同的瀏覽器。 – jammykam

+0

謝謝jammykam,我可以在同時進行的會話中打開兩個選項卡。但是兩個不同的瀏覽器(在兩臺不同的計算機上)就是我想要避免的。 – jdchizzle

回答

8

一般的想法是,你想在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()以獲取更多有關完成此操作的數據(或者獲得付費計劃,以免對連接造成困難)。

+0

感謝您提供非常詳細的解決方案。目前,我正在將個人用戶的數據直接寫入通過其轉義電子郵件地址索引的Firebase中。將location_ID寫入通過簡單的電子郵件/密碼登錄生成的UID鍵(在其電子郵件地址索引表下),並使用該標識符來控制寫入訪問(而不是自定義安全令牌),可以嗎? – jdchizzle

+0

簡單登錄可以區分不同位置的用戶。由於標記中沒有任何內容,因此您需要創建自己的標記才能使其適用於安全規則。 – Kato

相關問題