feathers-authentication
Add Authentication to your FeathersJS app.
feathers-authentication
adds shared PassportJS authentication for Feathers HTTP REST and WebSocket transports using JSON Web Tokens.
Installation
npm install feathers-authentication@pre --save
Documentation
API
This module contains:
- The main entry function
- A single
authenticate
hook - The authentication
service
- Socket listeners
- Express middleware
- A Passport adapter for Feathers
Hooks
feathers-authentication
only includes a single hook. This bundled authenticate
hook is used to register an array of one or more authentication strategies on a service method.
Note: Most of the time you should be registering this on your /authentication
service. Without it you can hit the authentication
service and generate a JWT accessToken
without authentication (ie. anonymous authentication).
app.service('authentication').hooks({
before: {
create: [
auth.hooks.authenticate(['jwt', 'local']),
],
remove: [
auth.hooks.authenticate('jwt')
]
}
});
The hooks that were once bundled with this module are now located at feathers-legacy-authentication-hooks. They are completely compatible but are deprecated and will not be supported by the core team going forward.
Express Middleware
Just like hooks there is an authenticate
middleware. It is used the exact same way you would the regular Passport express middleware.
app.post('/login', auth.express.authenticate('local', { successRedirect: '/app', failureRedirect: '/login' }));
These other middleware are included and exposed but typically you don't need to worry about them:
emitEvents
- emit login
and logout
eventsexposeCookies
- expose cookies to Feathers so they are available to hooks and servicesexposeHeaders
- expose headers to Feathers so they are available to hooks and servicesfailureRedirect
- support redirecting on auth failure. Only triggered if hook.redirect
is set.successRedirect
- support redirecting on auth success. Only triggered if hook.redirect
is set.setCookie
- support setting the JWT access token in a cookie. Only enabled if cookies are enabled.
Default Options
The following default options will be mixed in with your global auth
object from your config file. It will set the mixed options back on to the app so that they are available at any time by calling app.get('auth')
. They can all be overridden and are depended upon by some of the authentication plugins.
{
path: '/authentication',
header: 'Authorization',
entity: 'user',
service: 'users',
passReqToCallback: true,
session: false,
cookie: {
enabled: false,
name: 'feathers-jwt',
httpOnly: false,
secure: true
},
jwt: {
header: { typ: 'access' },
audience: 'https://yourdomain.com',
subject: 'anonymous',
issuer: 'feathers',
algorithm: 'HS256',
expiresIn: '1d'
}
}
Complementary Plugins
The following plugins are complementary but entirely optional:
Migrating to 1.x
Refer to the migration guide.
Complete Example
Here's an example of a Feathers server that uses feathers-authentication
for local auth. You can try it out on your own machine by running the example.
Note: This does NOT implement any authorization. Use feathers-permissions for that.
const feathers = require('feathers');
const rest = require('feathers-rest');
const socketio = require('feathers-socketio');
const hooks = require('feathers-hooks');
const memory = require('feathers-memory');
const bodyParser = require('body-parser');
const errors = require('feathers-errors');
const errorHandler = require('feathers-errors/handler');
const local = require('feathers-authentication-local');
const jwt = require('feathers-authentication-jwt');
const auth = require('feathers-authentication');
const app = feathers();
app.configure(rest())
.configure(socketio())
.configure(hooks())
.use(bodyParser.json())
.use(bodyParser.urlencoded({ extended: true }))
.configure(auth({ secret: 'supersecret' }))
.configure(local())
.configure(jwt())
.use('/users', memory())
.use('/', feathers.static(__dirname + '/public'))
.use(errorHandler());
app.service('authentication').hooks({
before: {
create: [
auth.hooks.authenticate(['jwt', 'local'])
],
remove: [
auth.hooks.authenticate('jwt')
]
}
});
app.service('users').hooks({
before: {
find: [
auth.hooks.authenticate('jwt')
],
create: [
local.hooks.hashPassword({ passwordField: 'password' })
]
}
});
const port = 3030;
let server = app.listen(port);
server.on('listening', function() {
console.log(`Feathers application started on localhost:${port}`);
});
Client use
You can use the client in the Browser, in NodeJS and in React Native.
import io from 'socket.io-client';
import feathers from 'feathers/client';
import hooks from 'feathers-hooks';
import socketio from 'feathers-socketio/client';
import localstorage from 'feathers-localstorage';
import authentication from 'feathers-authentication-client';
const socket = io('http://localhost:3030/');
const app = feathers()
.configure(socketio(socket))
.configure(hooks())
.configure(authentication({ storage: window.localStorage }));
app.authenticate({
strategy: 'local',
email: 'admin@feathersjs.com',
password: 'admin'
}).then(function(result){
console.log('Authenticated!', result);
}).catch(function(error){
console.error('Error authenticating!', error);
});
License
Copyright (c) 2016
Licensed under the MIT license.