New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

feathers-authentication

Package Overview
Dependencies
Maintainers
3
Versions
64
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

feathers-authentication - npm Package Compare versions

Comparing version 0.3.5 to 0.4.0

2

examples/basic/index.js

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc