Introduction to koa-passport
Koa-passport is a middleware for Koa, a progressive Node.js framework, that simplifies the process of implementing authentication in your Koa applications. It is built on the robust Passport.js library and leverages its wide range of authentication strategies to provide secure authentication mechanisms. In this article, we will discuss the various APIs provided by koa-passport along with code snippets to guide you through integrating them into your Koa application.
Installation
npm install koa-passport
Basic Setup
const Koa = require('koa'); const Router = require('@koa/router'); const session = require('koa-session'); const bodyParser = require('koa-bodyparser'); const passport = require('koa-passport'); const app = new Koa(); const router = new Router(); app.keys = ['your-session-secret']; app.use(session(app)); app.use(bodyParser()); app.use(passport.initialize()); app.use(passport.session()); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => { console.log('Server is running on http://localhost:3000'); });
Defining and Using Strategies
Local Strategy
const LocalStrategy = require('passport-local').Strategy; passport.use(new LocalStrategy(function(username, password, done) { // Here you will retrieve the user from your database User.findOne({ username: username }, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } if (!user.validPassword(password)) { return done(null, false); } return done(null, user); }); }));
Serialize and Deserialize User
passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); });
Using Middleware in Routes
router.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
Google OAuth Strategy
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; passport.use(new GoogleStrategy({ clientID: GOOGLE_CLIENT_ID, clientSecret: GOOGLE_CLIENT_SECRET, callbackURL: "http://yourdomain:3000/auth/google/callback" }, function(token, tokenSecret, profile, done) { User.findOrCreate({ googleId: profile.id }, function (err, user) { return done(err, user); }); } ));
router.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login'] })); router.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login' }), function(req, res) { res.redirect('/'); });
App Example with Authentication
const Koa = require('koa'); const Router = require('@koa/router'); const session = require('koa-session'); const bodyParser = require('koa-bodyparser'); const passport = require('koa-passport'); const LocalStrategy = require('passport-local').Strategy; const app = new Koa(); const router = new Router(); app.keys = ['your-session-secret']; app.use(session(app)); app.use(bodyParser()); app.use(passport.initialize()); app.use(passport.session()); 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); } if (!user.validPassword(password)) { return done(null, false); } return done(null, user); }); })); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); router.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); app.use(router.routes()).use(router.allowedMethods()); app.listen(3000, () => { console.log('Server is running on http://localhost:3000'); });
In this article, we explored the `koa-passport` middleware and various ways to integrate different strategies into our Koa applications. We reviewed the local and Google OAuth authentication methods and even presented a complete application example. By utilizing `koa-passport`, developers can create secure and maintainable authentication systems with ease.
Hash: 0af30059afb9c999ffd46e8ea9969b45e8ab236a395e0a27b3c28aa12382f142