會話
會話表示登錄到設備的用戶實例。當用戶登錄或注冊時會自動創建會話。當用戶注銷時,它們會自動刪除。每個“user-installation”對都有一個不同的Session對象; 如果用戶從已經登錄的設備發出登錄請求,該用戶Installation上之前的Session對象將被自動刪除。Session對象存儲在Parse上的Session類中,您可以在Parse數據瀏覽器上查看它們。我們提供一組API來管理您應用中的Session對象。
Session是Parse Object的子類,因此您可以以與Parse中操作正常對象相同的方式查詢、更新和刪除sessions。因為Parse Cloud會在您登錄或注冊用戶時自動創建sessions,因此您不應手動創建Session對象,除非您正在構建“Parse IoT”應用程序(如Arduino或Embedded C)。刪除Session將會把正在使用此會話令牌的設備中的用戶注銷掉。
與其他Parse對象不同,Session類沒有Cloud Code觸發器。所以你不能為Session類注冊一個beforeSave或者afterSave處理程序。
1.Session 屬性
Session對象具有以下特殊字段:
- sessionToken(只讀):用于在Parse API請求上進行身份驗證的字符串令牌。在Session查詢響應中,只有當前Session對象包含一個會話令牌。
- user:(只讀)指向此會話所用User對象的指針。
- createdWith(只讀):有關如何創建此會話的信息(例如{ "action": "login", "authProvider": "password"})。
- action可以有以下值:login,signup,create,或upgrade。create action是指開發者通過存儲Session對象手動創建會話。upgrade action是指用戶從舊會話令牌升級到可撤銷會話。
- authProvider可以有以下值:password,anonymous,facebook,或twitter。
- restricted (只讀):此會話是否受限制,為布爾值。
- 受限的會話沒有對Parse上的User和Session,和Role類的寫入權限。受限的會話也無法讀取不受限的會話。
- 在用戶登錄/注冊期間,Parse Cloud自動創建的所有會話將不受限制。開發人員從客戶端(僅對“Parse for IoT”應用程序)通過保存一個新的Session對象而手動創建的所有會話都是受限的。
- expiresAt(只讀):該Session對象將被自動刪除時的大約UTC日期。您可以在應用程序的Parse.com dashboard設置頁面中配置會話過期時間(1年不活動則到期或無過期)。
- installationId(只能設置一次):表示會話登錄位置的Installation字符串。對于Parse SDK,當用戶登錄或注冊時,該字段將自動設置。除installationId外的所有特殊字段,只能由Parse Cloud自動設置。您可以將自定義字段添加到Session對象中,但請記住,任何已登錄的設備(帶有會話令牌)都可以讀取屬于同一用戶的其他會話(除非您禁用類級權限,請參見下文)。
2.處理無效的session Token錯誤
對于可撤銷會話,如果從Parse Cloud中刪除其對應的Session對象,則當前會話令牌可能無效。如果您實現了一個會話管理器UI可允許用戶在其他設備上注銷,或者手動通過Cloud Code,REST API或數據瀏覽器刪除會話,則可能會發生這種情況。會話也可能由于自動過期(如果在應用設置中配置)被刪除。只要設備的會話令牌不再與Parse Cloud上的Session對象相對應時,來自該設備的所有API請求都將失敗,并顯示“錯誤209:無效的會話令牌”(Error 209: invalid session token)。
為了處理這個錯誤,我們建議您編寫一個由所有Parse請求錯誤回調調用的全局公用函數。然后,您可以在此全局函數中處理“無效會話令牌”錯誤。您應該提示用戶再次登錄,以便他們可以獲得一個新的會話令牌。代碼如下所示:
function handleParseError(err) {
switch (err.code) {
case Parse.Error.INVALID_SESSION_TOKEN:
Parse.User.logOut();
... // If web browser, render a log in screen
... // If Express.js, redirect the user to the log in route
break;
... // Other Parse API errors that you want to explicitly handle
}
}
// For each API request, call the global error handler
query.find().then(function() {
...
}, function(err) {
handleParseError(err);
});
3.Session 安全
Session對象只能由用戶字段中指定的用戶訪問。所有Session對象都具有只有該用戶可讀寫的ACL。您不能更改此ACL。這意味著查詢會話只會返回與當前登錄用戶匹配的對象。
當您通過User login方法登錄用戶時,Parse會自動在Parse Cloud中創建一個新的不受限Session對象。注冊操作和Facebook/Twitter登錄時也一樣。
從客戶端SDK手動創建會話對象(創建一個Session實例并保存)始終是受限的。您不能使用對象創建API手動創建一個不受限的會話。
受限會話被禁止創建、修改、或刪除User、Session以及Role類中的任何數據。受限會話也無法讀取不受限的會話。受限會話對于“Parse for IoT”設備(例如Arduino或 Embedded C)很有用,相對移動應用程序,它們很可能運行在不太可靠的物理環境。但是,請記住,受限會話仍然可以讀取User,Session以及Role類的數據,并可以像正常的session一樣讀/寫任何其他類的數據。因此,對于物聯網設備,使其處于安全的物理環境,理想情況下使用加密存儲來保存會話令牌,仍然至關重要。
如果你想防止受限會話修改User、Session或者Role之外的其他類,你可以為該類寫一個Cloud Code beforeSave處理程序:
Parse.Cloud.beforeSave("MyClass", function(request, response) {
Parse.Session.current().then(function(session) {
if (session.get('restricted')) {
response.error('write operation not allowed');
}
response.success();
});
});
您可以像Parse中的其他類一樣為Session類配置類級別權限(CLP)。CLP通過Session API 限制會話的讀取/寫入,但是當用戶登錄,注冊和注銷時,不會限制Parse Cloud的自動會話創建/刪除操作。我們建議您禁用應用程序不需要的所有CLP。以下是會話CLP的常見用例:
- Find, Delete - 用于構建了UI界面,允許用戶在所有設備上查看其活動會話,并在其他設備上注銷會話。如果您的應用沒有此功能,您應該禁用這些權限。
- Create - 用于“Parse for IoT”應用程序(例如Arduino或嵌入式C),為除手機應用程序之外的其他設備提供受限的用戶會話。在構建移動和網絡應用程序時,應禁用此權限。對于“Parse for IoT”應用程序,您應該檢查您的IoT設備是否實際需要訪問用戶特定的數據。如果沒有,那么您的IoT設備不需要用戶會話,您應該禁用此權限。
- Get, Update, Add Field - 除非需要這些操作,否則應禁用這些權限。