feathers-authentication
Advanced tools
Comparing version 0.3.5 to 0.4.0
@@ -8,3 +8,3 @@ var feathers = require('feathers'); | ||
var bodyParser = require('body-parser'); | ||
var authentication = require('../../lib/index').default; | ||
var authentication = require('../../lib/index'); | ||
var authHooks = require('../../lib/index').hooks; | ||
@@ -11,0 +11,0 @@ |
@@ -6,38 +6,37 @@ 'use strict'; | ||
}); | ||
exports.populateHeader = exports.populateParams = undefined; | ||
var _utils = require('./utils'); | ||
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); | ||
var _utils2 = _interopRequireDefault(_utils); | ||
exports.populateParams = populateParams; | ||
exports.populateHeader = populateHeader; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } | ||
var populateParams = exports.populateParams = function populateParams() { | ||
function populateParams(options) { | ||
return function (hook) { | ||
hook.params.user = _utils2.default.getUser(); | ||
hook.params.token = _utils2.default.getToken(); | ||
}; | ||
}; | ||
var storage = hook.app.service(options.storage); | ||
var populateHeader = exports.populateHeader = function populateHeader() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
// We can not run this hook on the storage service itself | ||
if (this !== storage) { | ||
return Promise.all([storage.get('user'), storage.get('token')]).then(function (_ref) { | ||
var _ref2 = _slicedToArray(_ref, 2); | ||
var defaults = { | ||
header: 'Authorization' | ||
var user = _ref2[0]; | ||
var token = _ref2[1]; | ||
Object.assign(hook.params, { user: user, token: token }); | ||
return hook; | ||
}); | ||
} | ||
}; | ||
} | ||
options = Object.assign({}, defaults, options); | ||
function populateHeader() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
return function (hook) { | ||
if (hook.params.token) { | ||
hook.params.headers = Object.assign({}, _defineProperty({}, options.header, hook.params.token), hook.params.headers); | ||
hook.params.headers = Object.assign({}, _defineProperty({}, options.header || 'Authorization', hook.params.token), hook.params.headers); | ||
} | ||
}; | ||
}; | ||
exports.default = { | ||
populateParams: populateParams, | ||
populateHeader: populateHeader | ||
}; | ||
} |
@@ -8,9 +8,28 @@ 'use strict'; | ||
exports.default = function () { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
var authOptions = Object.assign({}, defaults, options); | ||
var authOptions = Object.assign({}, defaults, opts); | ||
return function () { | ||
var app = this; | ||
var storage = function storage() { | ||
return app.service(authOptions.storage); | ||
}; | ||
if (!storage) { | ||
throw new Error('You need register a local store before you can use feathers-authentication. Did you call app.use(\'storage\', localstorage())'); | ||
} | ||
var handleResponse = function handleResponse(response) { | ||
return storage().create([{ | ||
id: 'token', | ||
value: response.token | ||
}, { | ||
id: 'user', | ||
value: response.data | ||
}]).then(function () { | ||
return response; | ||
}); | ||
}; | ||
app.authenticate = function (options) { | ||
@@ -33,28 +52,38 @@ if (!options.type) { | ||
// TODO (EK): Handle OAuth logins | ||
// If we are using a REST client | ||
if (app.rest) { | ||
return app.service(endPoint).create(options).then(function (response) { | ||
_utils2.default.setToken(response.token); | ||
_utils2.default.setUser(response.data); | ||
return resolve(response); | ||
}).catch(reject); | ||
return app.service(endPoint).create(options).then(handleResponse); | ||
} | ||
if (app.io || app.primus) { | ||
var transport = app.io ? 'io' : 'primus'; | ||
(function () { | ||
var socket = app.io || app.primus; | ||
var handleUnauthorized = function handleUnauthorized(error) { | ||
// Unleak event handlers | ||
this.off('disconnect', reject); | ||
this.off('close', reject); | ||
app[transport].on('unauthorized', function (error) { | ||
// console.error('Unauthorized', error); | ||
return reject(error); | ||
}); | ||
reject(error); | ||
}; | ||
var handleAuthenticated = function handleAuthenticated(response) { | ||
// We need to bind and unbind the event handlers that didn't run | ||
// so that they don't leak around | ||
this.off('unauthorized', handleUnauthorized); | ||
this.off('disconnect', reject); | ||
this.off('close', reject); | ||
app[transport].on('authenticated', function (response) { | ||
// console.log('authenticated', response); | ||
_utils2.default.setToken(response.token); | ||
_utils2.default.setUser(response.data); | ||
handleResponse(response).then(function (reponse) { | ||
return resolve(reponse); | ||
}).catch(function (error) { | ||
throw error; | ||
}); | ||
}; | ||
return resolve(response); | ||
}); | ||
// Also, binding to events that aren't fired (like `close`) | ||
// for Socket.io doesn't hurt if we unbind once we're done | ||
socket.once('disconnect', reject); | ||
socket.once('close', reject); | ||
socket.once('unauthorized', handleUnauthorized); | ||
socket.once('authenticated', handleAuthenticated); | ||
})(); | ||
} | ||
@@ -64,13 +93,10 @@ | ||
if (app.io) { | ||
var socket = app.io; | ||
// If we aren't already connected then throw an error | ||
if (!app.io.connected) { | ||
if (!socket.connected) { | ||
throw new Error('Socket not connected'); | ||
} | ||
app.io.on('disconnect', function (error) { | ||
// console.error('Socket disconnected', error); | ||
return reject(error); | ||
}); | ||
app.io.emit('authenticate', options); | ||
socket.emit('authenticate', options); | ||
} | ||
@@ -80,13 +106,10 @@ | ||
if (app.primus) { | ||
var socket = app.primus; | ||
// If we aren't already connected then throw an error | ||
if (app.primus.readyState !== 3) { | ||
if (socket.readyState !== 3) { | ||
throw new Error('Socket not connected'); | ||
} | ||
app.primus.on('close', function (error) { | ||
console.error('Socket disconnected', error); | ||
return reject(error); | ||
}); | ||
app.primus.send('authenticate', options); | ||
socket.send('authenticate', options); | ||
} | ||
@@ -97,10 +120,15 @@ }); | ||
app.user = function () { | ||
return _utils2.default.getUser(); | ||
return storage().get('user').then(function (data) { | ||
return data.value; | ||
}); | ||
}; | ||
app.token = function () { | ||
return storage().get('token').then(function (data) { | ||
return data.value; | ||
}); | ||
}; | ||
app.logout = function () { | ||
// remove user and token from localstorage | ||
// on React native it's async storage | ||
_utils2.default.clearToken(); | ||
_utils2.default.clearUser(); | ||
return storage.remove(null, { id: { $in: ['user', 'token'] } }); | ||
}; | ||
@@ -111,3 +139,6 @@ | ||
app.mixins.push(function (service) { | ||
service.before(_hooks2.default.populateParams()); | ||
if (!service.before || !service.after) { | ||
throw new Error('It looks like feathers-hooks isn\'t ccnfigured. It is required before you configure feathers-authentication.'); | ||
} | ||
service.before(hooks.populateParams(authOptions)); | ||
}); | ||
@@ -118,3 +149,6 @@ | ||
app.mixins.push(function (service) { | ||
service.before(_hooks2.default.populateHeader()); | ||
if (!service.before || !service.after) { | ||
throw new Error('It looks like feathers-hooks isn\'t ccnfigured. It is required before you configure feathers-authentication.'); | ||
} | ||
service.before(hooks.populateHeader(authOptions)); | ||
}); | ||
@@ -127,12 +161,8 @@ } | ||
var _hooks2 = _interopRequireDefault(_hooks); | ||
var hooks = _interopRequireWildcard(_hooks); | ||
var _utils = require('./utils'); | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
var _utils2 = _interopRequireDefault(_utils); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var defaults = { | ||
// userEndpoint: '/users', | ||
storage: '/storage', | ||
localEndpoint: '/auth/local', | ||
@@ -139,0 +169,0 @@ tokenEndpoint: '/auth/token' |
@@ -22,3 +22,3 @@ 'use strict'; | ||
if (hook.type === 'after') { | ||
id = hook.result[options.idField]; | ||
id = hook.result.id; | ||
} | ||
@@ -25,0 +25,0 @@ // Check to see if we have an id from a decoded JWT |
{ | ||
"name": "feathers-authentication", | ||
"description": "Add Authentication to your FeathersJS app.", | ||
"version": "0.3.5", | ||
"version": "0.4.0", | ||
"homepage": "https://github.com/feathersjs/feathers-authentication", | ||
@@ -51,2 +51,3 @@ "main": "lib/", | ||
"feathers-errors": "^2.0.1", | ||
"feathers-hooks": "^1.3.0", | ||
"jsonwebtoken": "^5.4.0", | ||
@@ -65,3 +66,4 @@ "passport": "^0.3.0", | ||
"feathers-hooks": "^1.0.0-pre.4", | ||
"feathers-memory": "^0.6.0", | ||
"feathers-localstorage": "^0.2.0", | ||
"feathers-memory": "^0.6.1", | ||
"feathers-primus": "^1.3.2", | ||
@@ -68,0 +70,0 @@ "feathers-rest": "^1.2.2", |
@@ -92,2 +92,3 @@ # feathers-authentication | ||
import socketio from 'feathers-socketio/client'; | ||
import localstorage from 'feathers-localstorage'; | ||
import authentication from 'feathers-authentication/client'; | ||
@@ -99,2 +100,3 @@ | ||
.configure(hooks()) | ||
.use('storage', localstorage()) | ||
.configure(authentication()); | ||
@@ -117,2 +119,9 @@ | ||
### 0.4.0 | ||
- Using `feathers-localstorage` for storing user and token credentials. | ||
- Adds support for using auth in NodeJS and React Native | ||
- Fixes issue where user was not getting added to response on authentication for databases that use `_id` as their field name. | ||
- adds better client side error handling | ||
### 0.3.1 | ||
@@ -119,0 +128,0 @@ |
Sorry, the diff of this file is not supported yet
165
232179
7
22
29
4760
+ Addedfeathers-hooks@^1.3.0
+ Addedfeathers-commons@0.8.7(transitive)
+ Addedfeathers-hooks@1.8.1(transitive)
+ Addedfeathers-hooks-common@2.0.3(transitive)
+ Addedtraverse@0.6.6(transitive)
+ Addeduberproto@1.2.0(transitive)