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)...