123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /**
- * Module dependencies.
- */
- var passport = require('passport-strategy')
- , util = require('util')
- , lookup = require('./utils').lookup;
- /**
- * `Strategy` constructor.
- *
- * The local authentication strategy authenticates requests based on the
- * credentials submitted through an HTML-based login form.
- *
- * Applications must supply a `verify` callback which accepts `username` and
- * `password` credentials, and then calls the `done` callback supplying a
- * `user`, which should be set to `false` if the credentials are not valid.
- * If an exception occured, `err` should be set.
- *
- * Optionally, `options` can be used to change the fields in which the
- * credentials are found.
- *
- * Options:
- * - `usernameField` field name where the username is found, defaults to _username_
- * - `passwordField` field name where the password is found, defaults to _password_
- * - `passReqToCallback` when `true`, `req` is the first argument to the verify callback (default: `false`)
- *
- * Examples:
- *
- * passport.use(new LocalStrategy(
- * function(username, password, done) {
- * User.findOne({ username: username, password: password }, function (err, user) {
- * done(err, user);
- * });
- * }
- * ));
- *
- * @param {Object} options
- * @param {Function} verify
- * @api public
- */
- function Strategy(options, verify) {
- if (typeof options == 'function') {
- verify = options;
- options = {};
- }
- if (!verify) { throw new TypeError('LocalStrategy requires a verify callback'); }
-
- this._usernameField = options.usernameField || 'username';
- this._passwordField = options.passwordField || 'password';
-
- passport.Strategy.call(this);
- this.name = 'local';
- this._verify = verify;
- this._passReqToCallback = options.passReqToCallback;
- }
- /**
- * Inherit from `passport.Strategy`.
- */
- util.inherits(Strategy, passport.Strategy);
- /**
- * Authenticate request based on the contents of a form submission.
- *
- * @param {Object} req
- * @api protected
- */
- Strategy.prototype.authenticate = function(req, options) {
- options = options || {};
- var username = lookup(req.body, this._usernameField) || lookup(req.query, this._usernameField);
- var password = lookup(req.body, this._passwordField) || lookup(req.query, this._passwordField);
-
- if (!username || !password) {
- return this.fail({ message: options.badRequestMessage || 'Missing credentials' }, 400);
- }
-
- var self = this;
-
- function verified(err, user, info) {
- if (err) { return self.error(err); }
- if (!user) { return self.fail(info); }
- self.success(user, info);
- }
-
- try {
- if (self._passReqToCallback) {
- this._verify(req, username, password, verified);
- } else {
- this._verify(username, password, verified);
- }
- } catch (ex) {
- return self.error(ex);
- }
- };
- /**
- * Expose `Strategy`.
- */
- module.exports = Strategy;
|