Examples > User Security > Advanced Example

Example from https://firebase.com/docs/platforms/web/guide/user-security.html

by Lore ZZ

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>
<script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script>
<script src="https://cdn-gh.firebase.com/demo-utils-script/demo-utils.js"></script>
<p>Pick a room:
    <select></select>
    <a href="#logout">log out</a>
</p>
<ul class="chatbox"></ul>
<form id="chatForm">
    <input type="text" name="data" />
    <button type="submit">Send</button>
    <a href="#leave">leave room</a>
</form>
<p class="result"></p>
<p data-target="demo-links"></p>
<div id="login-layer"><button id="login">Log in with GitHub</button></div>
<form id="joinForm">
    <input type="text" placeholder="Your name..." /><button type="submit">Join Now</button>
</form>

CSS

ul.chatbox {
    height: 100px;
    background-color: #eee;
    border: 1px solid #aaa;
    padding: 10px;
    border-radius: 10px;
    overflow-y: auto;
    word-break: break-all;
    list-style-type: none;
}
p.result {
    color: #00AA00;
    font-weight: bold;
}
p.result.note {
    color: gray;
    font-weight: normal;
    font-style: italic;
}
p.result.error {
    color: red;
}
input[name="data"] {
    width: 200px;
}
input[name="user"] {
    width: 100px;
}
input {
    font-size: 14px;
    line-height: 16px;
}
#login-layer {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    background-color: white;
    text-align: center;
    padding-top: 50px;
    z-index: 9999;
}
#joinForm {
    display: none;
}
#chatForm {
    display: none;   
}
#login {
  font-size: 24px;
  line-height: 30px;
  padding: 10px;
}

JavaScript

function runExample(demoUrl) {
    "use strict";
    
    var uid = null, room = null, submitted = false, sub = null, members = {}, userName;
    var ref = new Firebase(demoUrl);
    var $inp = $('input[name=data]');
    var $join = $('#joinForm');
    
    // handle input and form events
    $('#chatForm').submit(processForm);
    $inp.on('keyup', _.debounce(countChars, 50));
    $('#login').click(authenticate);
    $('a[href="#logout"]').click(logout);
    $('a[href="#leave"]').click(leaveRoom);
    $join.submit(joinRoom);
    
    function authenticate(e) {
        e.preventDefault();
        ref.authWithOAuthPopup('github', function(err, user) {
            if (err) {
                console.log(err, 'error');
            } else if (user) {
                // logged in!
                uid = user.uid;
                console.log('logged in with id', uid);
                $('#login-layer').hide();
                ref.child('room_names').once('value', buildRoomList);
            } else {
                // logged out
                $('#login-layer').show();
            }
        });
    }
    
    function logout(e) {
       e.preventDefault();
       ref.unauth();
    }

    // create option tags in our room select
    function buildRoomList(snap) {
        var $sel = $('select').empty();
        snap.forEach(function (ss) {
            $('<option />')
                .prop('value', ss.name())
                .text(ss.val())
                .appendTo($sel);
        });
        pickRoom();
        $sel.change(pickRoom);
    }

    // when the select is updated, load that room's messages
    function pickRoom() {
        roomOff();
        $('#chatForm').hide();
        var roomId = $('select').val();
        
        // see if we need to join or if we are already a member
        // by trying to load the list of members
        getMembers(roomId).then(loadRoom, showJoinForm);
    }
    
    function getMembers(roomId) {
        return $.Deferred(function(def)...