SailsJS v1.0 Bearer auth (API token)



首先,这不是重复的,因为所有的文档/答案都是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',
}
},
};

由于我对node,尤其是帆船还很陌生,所以我有很多问题。

  1. 如果数据库中的令牌是无效(或者我应该在注册/更改时只使用1个令牌密码?)
  2. 如何实现实际的身份验证过程使用passport
  3. 令牌是否应为安全原因
  4. 有没有更好的方法来实现我想要实现的目标?(将更确切地说,我想要一个RESTApi后端来服务于我的ReactJS前端具有为android/ios等重用相同后端的能力)

任何提示、链接、建议等都将不胜感激。感谢并宽恕我的知识匮乏!

编辑:这种方法会阻止我使用社交媒体登录吗(我也想在未来实现这一点)?

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

在api/policies文件夹中创建名为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.jsrequire('./api/strategies/jwt').passport();中。

现在,您可以在config/policies.js.中将策略应用于路由

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

const jwt = require('jsonwebtoken');
module.exports = {
generate: (id, email) => jwt.sign({ id, email }, jwtSecret, {
audience: jwtAudience,
expiresIn: jwtExpiresIn,
issuer: jwtIssuer,
})
};

最新更新