Skip to content

Commit

Permalink
feature: Add REST authenticate route + updating dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
gregorybesson committed Apr 3, 2017
1 parent 9fc836e commit f40a6e0
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/server/app.js
Expand Up @@ -147,7 +147,7 @@ app.use(express.static(__dirname + '/public'))

app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Headers", "Origin, X-Access-Token, X-Requested-With, Content-Type, Accept");
next();
});

Expand Down
1 change: 1 addition & 0 deletions src/server/controllers/index.js
Expand Up @@ -42,6 +42,7 @@ abeExtend.hooks.instance.trigger('beforeAddRoute', router)
router.get('/abe/rest/posts*', rest.posts)
router.get('/abe/rest/post*', rest.post)
router.get('/abe/rest/activity-stream', rest.activityStream)
router.post('/abe/rest/authenticate', rest.authenticate)

router.get('/abe/users/forgot', users.getForgot)
router.get('/abe/users/list', users.getList)
Expand Down
7 changes: 6 additions & 1 deletion src/server/middlewares/checkCsrf.js
Expand Up @@ -2,7 +2,12 @@ var middleware = function(err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') {
return next(err)
}else {
if( req.url.indexOf('/abe/users/forgot') > -1 || req.url.indexOf('/abe/users/login') > -1 || !/^\/abe/.test(req.url)) {
if( req.url.indexOf('/abe/users/forgot') > -1 ||
req.url.indexOf('/abe/users/login') > -1 ||
req.url.indexOf('/abe/rest/authenticate') > -1 ||
!/^\/abe/.test(req.url) ||
!/^\/abe/.test(req.url)
) {
return next()
}
}
Expand Down
83 changes: 83 additions & 0 deletions src/server/routes/rest/authenticate.js
@@ -0,0 +1,83 @@
import Cookies from 'cookies'
import moment from 'moment'
import Strategy from 'passport-local'
import passport from 'passport'
import jwt from 'jwt-simple'

import {
config,
User
} from '../../../cli'

/**
* Strategy
*/
passport.use(new Strategy(
function(username, password, done) {
User.utils.findByUsername(username, function(err, user) {
if (err) { return done(err) }
if (!user) { return done(null, false, { message: 'Incorrect username or password.' }) }
if(!User.utils.isValid(user, password)) {
return done(null, false, { message: 'Incorrect username or password.' })
}
return done(null, user)
})
}
))

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

passport.deserializeUser(function(id, done) {
User.utils.find(id, function (err, user) {
done(err, user)
})
})

var route = function(req, res, next) {
User.utils.loginLimitTry(req.body.username)
.then((limit) => {
if (limit != null) {
// all good
if (!limit.remaining) {
req.flash('info', 'Rate limit exceeded')
return res.status(401).json({ error: info });
}
}

passport.authenticate(
'local',
{ session: false},
function(err, user, info) {
var secret = config.users.secret
if (err) { return next(err) }

if (!user) {
req.flash('info', info.message)
//return res.redirect('/abe/users/login')
return res.status(401).json({ error: info });
}
var expires = moment().add(7, 'days').valueOf()
var token = jwt.encode({
iss: user.id,
exp: expires,
username: user.username,
name: user.name,
email: user.email,
role: user.role
}, secret)

var cookies = new Cookies( req, res, {
secure: config.cookie.secure
})
cookies.set( 'x-access-token', token )

var result = {}
res.set('Content-Type', 'application/json')
res.send(JSON.stringify(result))
})(req, res, next)
})
}

export default route
4 changes: 3 additions & 1 deletion src/server/routes/rest/index.js
@@ -1,9 +1,11 @@
import post from './post'
import posts from './posts'
import activityStream from './activity-stream'
import authenticate from './authenticate'

export {
post,
posts,
activityStream
activityStream,
authenticate
}

0 comments on commit f40a6e0

Please sign in to comment.