SailsJS v1.0 Bearer auth (токен API) - PullRequest
       23

SailsJS v1.0 Bearer auth (токен API)

0 голосов
/ 03 февраля 2019

Прежде всего, это НЕ дубликат, поскольку вся документация / ответы для версий до v1.0 существуют и, похоже, не работают.

I 'я пытаюсь реализовать простую аутентификацию с passport и SailsJS v1.0.

Проблема в том, что ... поскольку я новичок в этом, и в sailsjs (v1), похоже, отсутствуют примеры в Интернете, ядовольно застрял.

Приложение должно работать следующим образом -> Пользователь регистрируется, проверяет свою электронную почту и затем входит в систему. После входа в систему пользователь получает accessToken, который он должен использовать для отправки запросов к защищенным маршрутам.(через Bearer или что-то еще).

Токены должны быть сохранены в БД, чтобы я мог сделать их недействительными, когда пользователь меняет пароль и тому подобное.

Как мне достичь чего-то подобного?Это то, что я получил до сих пор (объединение старых / новых примеров в сети).

User.js (модель)

const bcrypt = require('bcryptjs');

module.exports = {
  attributes: {
    email: {
      type: 'string',
      required: true,
      unique: true
    },
    username: {
      type: 'string',
      required: true,
      unique: true
    },
    password: {
      type: 'string',
      required: true
    },
    tokens: {
      collection: 'token',
      via: 'userId'
    }
  },
  customToJSON: function () {
    return _.omit(this, ['password'])
  },
  beforeCreate: function (user, cb) {
    bcrypt.genSalt(10, function (err, salt) {
      bcrypt.hash(user.password, salt, null, function (err, hash) {
        if (err) return cb(err);
        user.password = hash;
        return cb();
      });
    });
  }
};

Token.js (модель)

module.exports = {

  attributes: {
    token: {
      type: 'string',
      required: true,
      unique: true
    },
    userId: {
      mode: 'user'
    },
    isValid: {
      type: 'bool',
    }
  },
};

Так как я очень новичок в узле и особенно паруса, у меня немало вопросов.

  1. Как я могу создать токен при входе пользователя в систему, если токен в БД недействителен(или я должен просто использовать 1 токен при регистрации / сменить пароль?)
  2. Как реализовать процесс аутентификации с использованием passport?
  3. Должен ли токен иметь определенный формат (количество символов и т. Д.) По соображениям безопасности?
  4. Есть ли лучший подход к тому, чего я пытаюсь достичь?(точнее, я хочу, чтобы сервер REST Api служил моему интерфейсу ReactJS с возможностью повторного использования этого же интерфейса для Android / IOS и т. д.).

Любые советы, ссылки, предложения и т. д. будут высоко оценены.Спасибо и смилуйся над моим отсутствием знаний!

РЕДАКТИРОВАТЬ: Неужели этот подход помешает мне использовать вход в социальные сети (я хочу реализовать это и в будущем)?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы можете использовать JWT для аутентификации.

Создать файл с именем isAuthenticated.js в папке api /icies со следующим кодом.

const passport = require('passport');

module.exports = async (req, res, proceed) => {
  passport.authenticate('jwt', { session: false }, (err, user, info) => {
    if (err) {
      res.serverError(err, err.message);
    }
    if (user) {
      req.user = user;
      return proceed();
    }
    if (info) {
      return res.forbidden(info);
    }
    // Otherwise, this request did not come from a logged-in user.
    return res.forbidden();
  })(req, res, proceed);
};

Создать папку стратегий в папке api с помощью jwt.jsфайл и следующий код.

const JwtStrategy = require('passport-jwt').Strategy;
const { ExtractJwt } = require('passport-jwt');
const passport = require('passport');

const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = JWT_SECRET;
opts.issuer = JWT_ISSUER;
opts.audience = JWT_AUDIENCE;
opts.jsonWebTokenOptions = {
  expiresIn: JWT_EXPIRES_IN,
};

module.exports = {
  /**
   * Passport Strategy
   */
  passport: () => {
    passport.use(new JwtStrategy(opts, (jwtPayload, done) => {
      User.findOne({ id: jwtPayload.id }, (err, user) => {
        if (err) {
          return done(err, null);
        }
        if (user) {
          return done(null, user);
        }
        return done({ message: 'No user account found' }, 'No user account found');
      });
    }));
  },
};

И в app.js require('./api/strategies/jwt').passport(); в верхней части файла.

Теперь вы можете применять политики к маршрутам в config /icies.js.

Для генерации JWT вы можете использовать следующий код.

const jwt = require('jsonwebtoken');

module.exports = {
  generate: (id, email) => jwt.sign({ id, email }, jwtSecret, {
    audience: jwtAudience,
    expiresIn: jwtExpiresIn,
    issuer: jwtIssuer,
  })
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...