JS on Backend

PassportJS & SOCKET.IO

Created by Maksym Tarasenko

Agenda

  • PASSPORTJS
  • SOCKET.IO

PASSPORTJS

  • Lighweight
  • Basic Auth
  • OAuth
  • OAuth2

LOCAL

var passport = require('passport') , LocalStrategy = require('passport-local').Strategy; passport.use(new LocalStrategy( function (username, password, done) { User.findOne({username: username}, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false, {message: 'Incorrect username.'}); } if (!user.validPassword(password)) { return done(null, false, {message: 'Incorrect password.'}); } return done(null, user); }); }

LOCAL

app.use(passport.initialize()); passport.serializeUser(function (user, done) { done(null, user.username); }); passport.deserializeUser(function (username, done) { User.findOne({username: username}, function (err, user) {return done(err, user);}); }) app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

OPEN ID

var passport = require('passport') , OpenIDStrategy = require('passport-openid').Strategy; passport.use(new OpenIDStrategy({ returnURL: 'http://www.example.com/auth/openid/return', realm: 'http://www.example.com/' }, function(identifier, done) { User.findOrCreate({ openId: identifier }, function(err, user) { done(err, user); }); } ));

OPEN ID

// Accept the OpenID identifier and redirect the user to their OpenID // provider for authentication. When complete, the provider will redirect // the user back to the application at: // /auth/openid/return app.post('/auth/openid', passport.authenticate('openid')); // The OpenID provider has redirected the user back to the application. // Finish the authentication process by verifying the assertion. If valid, // the user will be logged in. Otherwise, authentication has failed. app.get('/auth/openid/return', passport.authenticate('openid', { successRedirect: '/', failureRedirect: '/login' }));

OAUTH 1.0

var passport = require('passport') , OAuthStrategy = require('passport-oauth').OAuthStrategy; passport.use('provider', new OAuthStrategy({ requestTokenURL: 'https://www.provider.com/oauth/request_token', accessTokenURL: 'https://www.provider.com/oauth/access_token', userAuthorizationURL: 'https://www.provider.com/oauth/authorize', consumerKey: '123-456-789', consumerSecret: 'shhh-its-a-secret' callbackURL: 'https://www.example.com/auth/provider/callback' }, function(token, tokenSecret, profile, done) { User.findOrCreate(..., function(err, user) { done(err, user); }); } ));

OAUTH 2.0

var passport = require('passport') , OAuth2Strategy = require('passport-oauth').OAuth2Strategy; passport.use('provider', new OAuth2Strategy({ authorizationURL: 'https://www.provider.com/oauth2/authorize', tokenURL: 'https://www.provider.com/oauth2/token', clientID: '123-456-789', clientSecret: 'shhh-its-a-secret' callbackURL: 'https://www.example.com/auth/provider/callback' }, function(accessToken, refreshToken, profile, done) { User.findOrCreate(..., function(err, user) { done(err, user); }); } ));

OAUTH 2.0

// only one scope app.get('/auth/provider', passport.authenticate('provider', { scope: 'email' }) ); // multiple scopes app.get('/auth/provider', passport.authenticate('provider', { scope: ['email', 'sms'] }) );

REALTIME

  • Periodic Polling
  • Long Polling
  • Forever Frame
  • WebSockets

SOCKET.IO

var io = require('socket.io')(8080); io.on('connection', function (socket) { socket.emit('greet', { hello: 'world' }); socket.on('message', function (from, msg) { console.log('message by ', from, ' saying ', msg); }); socket.on('disconnect', function () { socket.emit('user disconnected'); }); });

SOCKET.IO

<script src "/socket.io/socket.io.js"></script> <script> var socket = io('http://localhost:8080'); socket.on('greet', function (data) { console.log(data); socket.emit('message', 'user', 'hello'); }); </script>

NAMESPACES

var io = require('socket.io')(8080); var chat = io .of('/chat') .on('connection', function (socket) { socket.emit('a message', { that: 'only' , '/chat': 'will get' }); chat.emit('a message', { everyone: 'in' , '/chat': 'will get' }); }); var news = io .of('/news') .on('connection', function (socket) { socket.emit('item', { news: 'item' }); });

NAMESPACES

var chat = io.connect('http://localhost/chat') , news = io.connect('http://localhost/news'); chat.on('connect', function () { chat.emit('hi!'); }); news.on('news', function () { news.emit('woot'); });

CALLBACKS

var io = require('socket.io')(8080); io.on('connection', function (socket) { socket.on('call me', function (name, fn) { fn('holla'); }); }); <script> var socket = io(); socket.on('connect', function () { socket.emit('call me', 'andrew', function (data) {// data will be 'holla' }); }); </script>

BROADCAST & VOLATILE

var io = require('socket.io')(8080); io.on('connection', function (socket) { socket.broadcast.emit('new user connected'); }); var io = require('socket.io')(8080); io.on('connection', function (socket) { var tweets = setInterval(function () { getCatsTweets(function (tweet) { socket.volatile.emit('cats tweet', tweet); }); }, 100); socket.on('disconnect', function () { clearInterval(tweets); }); });

Questions?