Skip to content

Commit

Permalink
Merge 230a47c into 33d420b
Browse files Browse the repository at this point in the history
  • Loading branch information
pin3da committed Jul 7, 2014
2 parents 33d420b + 230a47c commit b135a96
Show file tree
Hide file tree
Showing 14 changed files with 324 additions and 0 deletions.
19 changes: 19 additions & 0 deletions examples/express4-couchdb-resourceful/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
passport-couchdb
================

Example of passport authentication using Express 4.0, couchdb and resourceful.js

Provides a basic example of Sing up, Log in and Log out.

### Requirements

Just install [couchdb](http://couchdb.apache.org/) and create a db called 'passport-test'.

### Install

npm install

### Run

npm start

109 changes: 109 additions & 0 deletions examples/express4-couchdb-resourceful/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
var express = require('express'),
path = require('path'),
favicon = require('static-favicon'),
logger = require('morgan'),
cookieParser = require('cookie-parser'),
bodyParser = require('body-parser'),
session = require('express-session'),
engine = require('ejs-locals');

var routes = require('./routes/index');

// passport stuff
var passport = require('passport'),
flash = require('connect-flash'),
LocalStrategy = require('passport-local').Strategy;

var env = process.env.NODE_ENV || 'development',
config = require('./config/' + env + '.js'),
resourceful = require('resourceful');


var User = require('./models/user');


passport.serializeUser(function(user, done) {
done(null, user._id);
});

passport.deserializeUser(function(id, done) {
User.find({_id : id},function (err, user) {
if (err || user.length == 0)
done(err, null);
else
done(err, user[0]);
});
});


passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
User.find( {username : username}, function(err, user) {
if (err) { return done(err); }
if (!user || user.length == 0) { return done(null, false, { message: 'Unknown user ' + username }); }
user = user[0];
if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
return done(null, user);
})
});
}
));

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.engine('ejs', engine);

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// Passport stuff
app.use(session({ secret: 'some bad text' })); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(flash()); // use connect-flash for flash messages stored in session
require('./routes/index.js')(app, passport);


/// catch 404 and forwarding to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});

resourceful.use('couchdb', {database: config.database});


module.exports = app;
9 changes: 9 additions & 0 deletions examples/express4-couchdb-resourceful/bin/www
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
8 changes: 8 additions & 0 deletions examples/express4-couchdb-resourceful/config/development.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
host: 'localhost',
port: '5984',
database: 'passport-test',
username: '',
password: ''
};

12 changes: 12 additions & 0 deletions examples/express4-couchdb-resourceful/models/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

var resourceful = require('resourceful');

var User = module.exports = resourceful.define('user', function () {

this.string('name');
this.string('password');

this.timestamps();

});

23 changes: 23 additions & 0 deletions examples/express4-couchdb-resourceful/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.0.0",
"connect-flash": "^0.1.1",
"cookie-parser": "~1.0.1",
"debug": "~0.7.4",
"ejs": "~0.8.5",
"ejs-locals": "^1.0.2",
"express": "~4.0.0",
"express-session": "^1.6.1",
"morgan": "~1.0.0",
"passport": "^0.2.0",
"passport-local": "^1.0.0",
"resourceful": "^0.2.3",
"static-favicon": "~1.0.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
body {
padding: 50px;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}

a {
color: #00B7FF;
}
54 changes: 54 additions & 0 deletions examples/express4-couchdb-resourceful/routes/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
var User = require('../models/user');

module.exports = function(app, passport) {


app.get('/', function(req, res) {
res.render('index.ejs', {user : req.user});
});

app.get('/account', function(req, res) {
res.render('account.ejs', {user : req.user});
});

app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});

app.get('/login', function(req, res) {
res.render('login.ejs', { message: req.flash('loginMessage') });
});

app.post('/login', passport.authenticate('local', {
successRedirect : '/',
failureRedirect : '/login', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
}));

app.get('/signup', function(req, res) {
res.render('signup.ejs', { message: req.flash('signupMessage') });
});

// process the signup form
app.post('/signup', function(req, res) {
User.create(req.body.user, function(err, data) {
if (err) {
console.log('Error : ', err);
res.send(500, err);
} else {
res.redirect('/');
}
});
});


};

// route middleware to ensure user is logged in
function isLoggedIn(req, res, next) {
if (req.isAuthenticated())
return next();

res.redirect('/');
}
15 changes: 15 additions & 0 deletions examples/express4-couchdb-resourceful/views/account.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<% layout('layout') -%>

<% if (typeof user == 'object' && user) { %>
<div>
<label>Username:</label>
<label> <%= user.username %> </label><br/>
</div>
<div>
<label>Password:</label>
<label> <%= user.password%> </label> <br/>
</div>
<% } else { %>
<p> Please log in.
<% } %>

3 changes: 3 additions & 0 deletions examples/express4-couchdb-resourceful/views/error.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
7 changes: 7 additions & 0 deletions examples/express4-couchdb-resourceful/views/index.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<% layout('layout') -%>

<% if (!user) { %>
<h2>Welcome! Please log in.</h2>
<% } else { %>
<h2>Hello, <%= user.username %>.</h2>
<% } %>
27 changes: 27 additions & 0 deletions examples/express4-couchdb-resourceful/views/layout.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<title>Passport-Local Example</title>
</head>
<body>
<% if (typeof user == 'object' && user) { %>
<p>
<a href="/">Home</a> |
<a href="/account">Account</a> |
<a href="/logout">Log Out</a>
</p>
<% } else { %>
<p>
<a href="/">Home</a> |
<a href="/login">Log In</a> |
<a href="/signup"> Sign Up </a>
</p>
<% } %>

<% if (typeof message == 'object' && message) { %>
<p><%= message %></p>
<% } %>

<%- body %>
</body>
</html>
15 changes: 15 additions & 0 deletions examples/express4-couchdb-resourceful/views/login.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<% layout('layout') -%>

<form action="/login" method="post">
<div>
<label>Username:</label>
<input type="text" name="username"/><br/>
</div>
<div>
<label>Password:</label>
<input type="password" name="password"/>
</div>
<div>
<input type="submit" value="Submit"/>
</div>
</form>
15 changes: 15 additions & 0 deletions examples/express4-couchdb-resourceful/views/signup.ejs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<% layout('layout') -%>

<form action="/signup" method="post">
<div>
<label>Username:</label>
<input type="text" name="user[username]"/><br/>
</div>
<div>
<label>Password:</label>
<input type="password" name="user[password]"/>
</div>
<div>
<input type="submit" value="Submit"/>
</div>
</form>

0 comments on commit b135a96

Please sign in to comment.