首先,这是不是因为所有的文档/答案重复出有对之前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',
}
},
};
因为我很新的节点,特别是帆我已经得到了相当多的问题。
passport
实现实际的认证过程?任何提示,链接,建议等将得到高度赞赏。感谢和怜悯我的知识的缺乏!
编辑:请问这种方法使用社交媒体登录(我要实现的是,在未来的太)阻止我?
您可以使用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,
})
};