2016-03-31 4 views
0

У меня возникли проблемы с получением проверки подлинности Firebase для работы с анонимным пользователем. Я создаю приложение чата, используя Firechat.js, который прикрепляет обработчик onDisconnect(), чтобы установить пользователя «в автономном режиме».onDisconnect() с ошибкой разрешения на unauth()

Однако, кажется, что когда я вызываю firebase.unauth(), он регистрирует пользователя перед тем, как onDisconnect() имеет возможность установить «автономный» пользователь, поэтому он терпит неудачу с ошибкой разрешения (это моя теория) ,

Журнал показывает, как именно все Выясняется, как я войти в систему, а затем выйти из системы:

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 построен для этого сценария, так почему это провал?

ответ

1

Вы, кажется, путает несколько вещей:

  • вызов unauth() падения сеанса аутентификации для пользователя.
    • Это не отключает пользователя.
    • Это делает отменит прослушиватели для местоположения, требующего аутентификации.
  • код, который вы прикрепляете к onDisconnect(), запускается на серверах Firebase, как только они обнаруживают, что клиент отключен.
    • Если обработчик onDisconnect() удаляет пользователя из какой-либо системы присутствия, другие клиенты могут видеть, что пользователь исчезает.
    • Клиент, который отключен, не может сразу увидеть результат своего собственного разъединения, поскольку он уже отключен.
    • Если клиент хочет знать, когда он отключился, проверьте значение .info/connected.
Смежные вопросы