onDisconnect() 因 unauth() 权限错误而失败
onDisconnect() fails with permission error on unauth()
我无法让 Firebase 身份验证与匿名用户一起使用。我正在使用 Firechat.js 构建一个聊天应用程序,它附加了一个 onDisconnect() 处理程序来设置用户 "offline"。
但是,当我调用 firebase.unauth() 时,它似乎在 onDisconnect() 有机会设置用户 "offline" 之前将用户注销,因此失败并出现权限错误 (这是我的理论)。
日志准确地显示了我登录然后注销时发生的一切:
app.js: using username: John Smith <<logged in
app.js: calling firebase.unauth() <<logged out
firechat.js: Firechat Warning: Firechat requires an authenticated Firebase reference. Pass an authenticated reference before loading.
app.js: using username: Anonymous3aa-437b <<after logout, reauthenticate as anonymous
firebase.js: FIREBASE WARNING: set at /chat/user-names-online/john smith/-KE9LcpieTwxj_A4sBHz failed: permission_denied
如您所见,在 Firechat 有机会将之前的用户设置为离线之前,该用户是匿名的。 Here is the onDisconnect() bit in firechat.js
这是我的应用代码:
var $firebase = new Firebase(...);
var $firechat = new Firechat(...);
$firebase.onAuth(function(authData) {
if (authData) {
var username = authData[authData.provider].displayName;
var anonusername = "Anonymous" + authData.uid.substr(10, 8);
console.log('using username: ' + username || anonusername);
//set firechat user and resume chatting session (user becomes "online")
$firechat.setUser(authData.uid, username || anonusername, function() {
$firechat.resumeSession();
});
} else {
//if not logged in, authenticate anonymously
$firebase.authAnonymously(function(error) {
if (error) {
console.log(error);
}
});
}
});
这是在线用户名的安全规则:
"user-names-online": {
// A mapping of active, online lowercase usernames to sessions and user ids.
".read": true,
"$username": {
"$sessionId": {
".write": "(auth != null) && (!data.exists() || !newData.exists() || data.child('id').val() === auth.uid || auth.provider === 'anonymous')",
"id": {
".validate": "(newData.val() === auth.uid)"
},
"name": {
".validate": "(newData.isString())"
}
}
}
},
firechat 似乎是为这种情况而构建的,那为什么会失败?
您似乎混淆了一些事情:
- 正在调用
unauth()
删除用户的身份验证会话。
- 它不会断开用户连接。
- 它会取消任何需要身份验证的位置侦听器。
- 您附加到
onDisconnect()
的代码会在 Firebase 服务器上运行,一旦它们检测到客户端已断开连接。
- 如果
onDisconnect()
处理程序将用户从某种存在系统中删除,其他客户端可以看到该用户消失了。
- 断开连接的客户端无法立即看到自己断开连接的结果,因为它已经断开连接了。
- 如果客户端想知道它何时断开连接,请监视
.info/connected
值。
我无法让 Firebase 身份验证与匿名用户一起使用。我正在使用 Firechat.js 构建一个聊天应用程序,它附加了一个 onDisconnect() 处理程序来设置用户 "offline"。
但是,当我调用 firebase.unauth() 时,它似乎在 onDisconnect() 有机会设置用户 "offline" 之前将用户注销,因此失败并出现权限错误 (这是我的理论)。
日志准确地显示了我登录然后注销时发生的一切:
app.js: using username: John Smith <<logged in
app.js: calling firebase.unauth() <<logged out
firechat.js: Firechat Warning: Firechat requires an authenticated Firebase reference. Pass an authenticated reference before loading.
app.js: using username: Anonymous3aa-437b <<after logout, reauthenticate as anonymous
firebase.js: FIREBASE WARNING: set at /chat/user-names-online/john smith/-KE9LcpieTwxj_A4sBHz failed: permission_denied
如您所见,在 Firechat 有机会将之前的用户设置为离线之前,该用户是匿名的。 Here is the onDisconnect() bit in firechat.js
这是我的应用代码:
var $firebase = new Firebase(...);
var $firechat = new Firechat(...);
$firebase.onAuth(function(authData) {
if (authData) {
var username = authData[authData.provider].displayName;
var anonusername = "Anonymous" + authData.uid.substr(10, 8);
console.log('using username: ' + username || anonusername);
//set firechat user and resume chatting session (user becomes "online")
$firechat.setUser(authData.uid, username || anonusername, function() {
$firechat.resumeSession();
});
} else {
//if not logged in, authenticate anonymously
$firebase.authAnonymously(function(error) {
if (error) {
console.log(error);
}
});
}
});
这是在线用户名的安全规则:
"user-names-online": {
// A mapping of active, online lowercase usernames to sessions and user ids.
".read": true,
"$username": {
"$sessionId": {
".write": "(auth != null) && (!data.exists() || !newData.exists() || data.child('id').val() === auth.uid || auth.provider === 'anonymous')",
"id": {
".validate": "(newData.val() === auth.uid)"
},
"name": {
".validate": "(newData.isString())"
}
}
}
},
firechat 似乎是为这种情况而构建的,那为什么会失败?
您似乎混淆了一些事情:
- 正在调用
unauth()
删除用户的身份验证会话。- 它不会断开用户连接。
- 它会取消任何需要身份验证的位置侦听器。
- 您附加到
onDisconnect()
的代码会在 Firebase 服务器上运行,一旦它们检测到客户端已断开连接。- 如果
onDisconnect()
处理程序将用户从某种存在系统中删除,其他客户端可以看到该用户消失了。 - 断开连接的客户端无法立即看到自己断开连接的结果,因为它已经断开连接了。
- 如果客户端想知道它何时断开连接,请监视
.info/connected
值。
- 如果