Skip to content

Commit

Permalink
add express-session & passport example
Browse files Browse the repository at this point in the history
additionally add specs for the examples
  • Loading branch information
hnry committed Jul 4, 2016
1 parent 1c13525 commit 5701169
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 26 deletions.
7 changes: 2 additions & 5 deletions README.md
Expand Up @@ -18,9 +18,6 @@ Supported Express middleware and spirit middleware can be used in conjunction wi
##### Notes
If your Express middleware needs something unsupported, you can of course write a (spirit) middleware for specific implementations to get your Express middleware to run.

- Express error handling middleware `(err, req, res, next)` are not supported. Instead handle errors the conventional way by using `catch`.

- "originalUrl", "req", "_res" are special properties for the request or req, if a Express middleware overwrites these it may cause problems.

- It changes the original request map in spirit to be a `req` object with all the request map data moved over. Should have no functional impact.
Express error handling middleware `(err, req, res, next)` are not supported. Instead handle errors the conventional way by using `catch`.

For a full list of compatible API and middleware see [Docs](docs).
7 changes: 3 additions & 4 deletions examples/express-session.js
Expand Up @@ -4,7 +4,7 @@
*/
const http = require("http")
const spirit = require("spirit")
const {route} = require("spirit-router")
const {route, response} = require("spirit-router")
// normally this would be require("spirit-express")
const express = require("../index")

Expand All @@ -13,7 +13,7 @@ const session = require("express-session")
const example = (session) => {
if (!session.counter) session.counter = 0
session.counter += 1
return "session information: " + JSON.stringify(session)
return response(JSON.stringify(session)).type("json")
}

const app = route.define([
Expand All @@ -24,8 +24,7 @@ const middleware = [
express(session({
secret: "keyboardcat",
resave: false,
saveUninitialized: false,
maxAge: 60000
saveUninitialized: true
}))
]

Expand Down
41 changes: 24 additions & 17 deletions examples/passport.js
Expand Up @@ -13,27 +13,29 @@ const express = require("../index")
const passport = require("passport")
const Strategy = require('passport-local').Strategy

/*
* Since it's just an example, every authentication passes
*/
passport.use(new Strategy(
function(username, password, done) {
done(null, { id: 123 })
(username, password, done) => {
done(null, { id: username })
}
))

passport.serializeUser(function(user, done) {
passport.serializeUser((user, done) => {
done(null, user.id)
})

passport.deserializeUser(function(id, done) {
done(null, { id: 123 })
passport.deserializeUser((id, done) => {
done(null, { id: id })
})

const example = (user) => {
const example = (user, sessionid) => {
if (user) {
return "Hello " + user + ", you are Logged in!"
return "Hello " + user.id + ", you are Logged in!"
}
return "You are not logged in"
return "You are not logged in, <a href='/login'>Login</a>"
}

// just show a simple login form to get the idea
const login = () => {
return "<form method='post' action='/login'><input name='username' type='text'><input name='password' type='password'><input type='submit'></form>"
}
Expand All @@ -46,18 +48,23 @@ const auth_middleware = [
]

const app = route.define([
route.get("/", ["user"], example),
route.get("/", ["user", "sessionID"], example),
route.get("/login", [], login),
route.wrap(route.post("/login"), auth_middleware)
route.wrap(route.post("/login", [], "ok"), auth_middleware)
])

const middleware = [
express(require("body-parser").urlencoded({extended: true})),
express(require("cookie-parser")),
express(require("session")({ secret: "keyboardcat" })),
express(passport.session()),
express(passport.initialize()),
express(passport.session())
express(require("express-session")({
secret: "keyboardcat",
resave: false,
saveUninitialized: true
})),
express(require("body-parser").urlencoded({extended: true})),
]

const site = spirit.node.adapter(app, middleware)
http.createServer(site).listen(3009)

const server = http.createServer(site)
server.listen(3009)
35 changes: 35 additions & 0 deletions spec/examples/express-session-spec.js
@@ -0,0 +1,35 @@
const request = require("superagent")
const rewire = require("rewire")
const ex = rewire("../../examples/express-session")

const server = ex.__get__("server")
server.close()

describe("Middleware: express-session", () => {

beforeAll(() => {
server.listen(3009)
})

afterAll((done) => {
server.close(done)
})

it("ok", (done) => {
request.get("http://localhost:3009/")
.end((err, res) => {
const cookie = res.header["set-cookie"]
expect(res.status).toBe(200)
expect(res.body.counter).toBe(1)
request.get("http://localhost:3009/")
.set("Cookie", cookie)
.end((err, res) => {
expect(res.status).toBe(200)
expect(res.body.counter).toBe(2)
done()
})
})
})

})

43 changes: 43 additions & 0 deletions spec/examples/passport-spec.js
@@ -0,0 +1,43 @@
const request = require("superagent")
const rewire = require("rewire")
const ex = rewire("../../examples/passport")

const server = ex.__get__("server")
server.close()

describe("Middleware: passport", () => {

beforeAll(() => {
server.listen(3009)
})

afterAll((done) => {
server.close(done)
})

it("ok", (done) => {
// get initial cookie, init session
request.get("http://localhost:3009/")
.end((err, res) => {
const cookie = res.header["set-cookie"]

request.post("http://localhost:3009/login")
.set("Cookie", cookie)
.send("username=testuser")
.send("password=123")
.end((err, res) => {
expect(res.status).toBe(200)
expect(res.text).toMatch(/testuser/)

request.get("http://localhost:3009/")
.set("Cookie", cookie)
.end((err, res) => {
expect(res.status).toBe(200)
expect(res.text).toMatch(/testuser/)
done()
})
})
})
})

})

0 comments on commit 5701169

Please sign in to comment.