Secure p2p signalling and authentication for simple-peer using firebase realtime database.
-
Create a firebase project and setup the javascript client SDK.
-
Add these security rules in the firebase console to secure the signalling data.
{ "rules": { "peers": { "$uid": { "$id": { ".read": "auth != null && auth.uid == $uid", ".write": "auth != null && auth.uid == $uid", "$otherUid": { "$otherId": { ".read": "auth != null && auth.uid == $otherUid", ".write": "auth != null && auth.uid == $otherUid", "sdp": { ".validate": "newData.isString() && newData.val().length < 4000" }, "type": { ".validate": "newData.val() == 'offer' || newData.val() == 'answer' || newData.val() == 'error'" }, "$other": { ".validate": false } } } } } } } }
Signaling data is exchanged in
/peers/$uid/$id/$otherUid/$otherId
. Security rules ensure that only intended users can access signalling data and signals are valid.Shortcut:
https://console.firebase.google.com/project/<YOUR_PROJECT_ID>/database/rules
-
Enable your prefered sign-in method in the firebase console. Firepeer requires authentication, so at the very least, you have to select anonymous authentication.
Shortcut:
https://console.firebase.google.com/project/<YOUR_PROJECT_ID>/authentication/providers
npm install --save firepeer
<script src="https://cdn.jsdelivr.net/npm/firepeer@<FIREPEER_VERSION>/lib/firepeer.min.js"></script>
//alice side
firebase.initializeApp({
//values from firebase console
});
const alice = new FirePeer(firebase);
console.log(alice.id) // peer id of alice
//authenticate with the sign-in method you enabled in the console
await firebase.auth().signInWith*()
console.log(alice.uid) // uid of alice
// connect
const connection = await alice.connect(BOB_UID, BOB_ID);
// send a mesage to bob
connection.send('hello')
// bob side
firebase.initializeApp({
//values from firebase console
});
const bob = new FirePeer({
app: firebase.app()
});
console.log(bob.id) // id
//authenticate
await firebase.auth().signInWith*()
console.log(bob.uid) // peer id of bob
// wait for connection and receive message
bob.on('connection', (connection)=>{
connection.on('data', (data)=>{
console.log(data) //hello
})
})
Connections are just instances of simple-peer already connected!
https://natzcam.github.io/firepeer