SailsJS V1.0承载AUTH(API令牌)

问题描述 投票:0回答:1

首先,这是不是因为所有的文档/答案重复出有对之前V1.0版本,而且他们似乎并不管用。

我试图实现与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. 我怎么能创建用户登录令牌,如果在DB令牌是无效的(或者我应该只使用在注册/修改密码1个令牌?)
  2. 我如何使用passport实现实际的认证过程?
  3. 如果令牌是出于安全考虑特定的格式(字符等数)?
  4. 有没有什么我试图实现一个更好的方法? (更精确地说,我想一个REST API后端为我的阵营JS前端与重复使用相同的后端的Android / IOS等的能力)。

任何提示,链接,建议等将得到高度赞赏。感谢和怜悯我的知识的缺乏!

编辑:请问这种方法使用社交媒体登录(我要实现的是,在未来的太)阻止我?

node.js rest sails.js passport.js bearer-token
1个回答
1
投票

您可以使用JWT进行身份验证。

创建API文件名为isAuthenticated.js /政策,下面的代码文件夹中。

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);
};

与jwt.js文件,下面的代码创建API文件夹的策略。

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();

现在,您可以将策略应用到在配置/ policies.js的路由。

要生成JWT,您可以使用下面的代码。

const jwt = require('jsonwebtoken');

module.exports = {
  generate: (id, email) => jwt.sign({ id, email }, jwtSecret, {
    audience: jwtAudience,
    expiresIn: jwtExpiresIn,
    issuer: jwtIssuer,
  })
};
© www.soinside.com 2019 - 2024. All rights reserved.