Loopbackjs 使用Strongloop环回进行电子邮件验证-返回验证令牌
我目前正在开发一个API。我正在使用Strongloop(环回) 我试图在用户注册时实现电子邮件验证。我有一个“用户”模型,它扩展了内置的“用户”模型 现在,当用户注册(POST/users)时,会发送一封电子邮件,其中包含指向/users/confirm的链接以及三个适当的参数,即uid、redirect和令牌。当用户单击链接时,后者的电子邮件地址被正确验证(emailVerification字段变为true) 但是,我注意到,当对/users发出POST请求时,响应包含验证令牌。这正常吗?验证令牌不是只能通过发送的电子邮件访问吗 因为事实上,通过向/用户发出POST请求并在响应中获取验证令牌,用户可以轻松地向用户发送另一个请求/使用适当的参数(包括验证令牌)进行确认,并验证电子邮件地址,即使该地址不存在Loopbackjs 使用Strongloop环回进行电子邮件验证-返回验证令牌,loopbackjs,strongloop,Loopbackjs,Strongloop,我目前正在开发一个API。我正在使用Strongloop(环回) 我试图在用户注册时实现电子邮件验证。我有一个“用户”模型,它扩展了内置的“用户”模型 现在,当用户注册(POST/users)时,会发送一封电子邮件,其中包含指向/users/confirm的链接以及三个适当的参数,即uid、redirect和令牌。当用户单击链接时,后者的电子邮件地址被正确验证(emailVerification字段变为true) 但是,我注意到,当对/users发出POST请求时,响应包含验证令牌。这正常吗?验
我是Strongloop的新手,也许我遗漏了什么。你们能帮忙吗?我刚刚完成了这个例子。见:
@user2483431,验证电子邮件会在响应中公开电子邮件验证令牌以及用户id。正如您正确指出的,它可能会愚弄系统。一种解决方案是从响应中去除令牌值 在用户创建的afterRemote中,您可以使用
user.verify(options, function(err, response, next2) {
if (err) {
// error handling code
}
// stripping off verificationToken from response for security
var replacementText = "check email"
context.result.verificationToken = replacementText;
next();
});
希望这有帮助 如果您想创建用户注册验证链接,但不使用内置的user moder,那么您需要创建验证令牌,然后发送链接。我添加了两种方法。您还需要使用远程方法,其中一个参数是对象类型:您需要使用register email发送参数。该方法如下这里我们使用user=any变量名,modelN=modelname
modelN.sendVerificationEmail = function (data, callback) {
var user = loopback.models.modelN;
if (!data.email) {
return callback(commonUtils.buildError(
'Recipient email is required.', 400, 'EMAIL_REQUIRED'
));
}
if (!emailValidator.validate(data.email)) {
return callback(commonUtils.buildError(
'Must provide a valid email.', 400, 'INVALID_EMAIL'
));
}
var findOneuserPromise
= modelN.findOne({ 'where': { 'email': data.email }});
findOneBusinessEmployeePromise.then(function (user) {
if (!user) {
return callback();
}
var sendVerificationEmailPromise
= anothermodelname.sendVerificationEmail(user.id);
sendVerificationEmailPromise.then(function () {
callback();
});
sendVerificationEmailPromise.then(null, function (error) {
callback(error);
});
});
findOneuserPromise.then(null, function (error) {
callback(error);
});
};
我已经添加了另一个模型方法,然后添加这个
anothermodelname.sendVerificationEmail = function (userid) {
var modelN = loopback.models.modelN;
var Email = loopback.models.Email;
var deferred = Q.defer();
var findByIduserPromise = modelN.findById(userId);
findByIduserPromise.then(function (user) {
if (!user) {
return deferred.reject(commonUtils.buildError(
'Unknown "modelN" id "' + userId + '".',
404, 'MODEL_NOT_FOUND'
));
}
if (!user.verificationToken) {
return deferred.resolve(true);
}
modelN.generateVerificationToken(user,
function (verificationTokenError, verificationToken) {
if (verificationTokenError) {
return deferred.reject(verificationTokenError);
}
user.verificationToken = verificationToken;
var saveuserPromise = user.save();
saveuserPromise.then(function (updateduser) {
var link = emailConf.clientBaseUrl +
emailConf.verifyEmailRedirect + '?uid=' +
updateduser.id + '&token=' +
updateduser.verificationToken;
console.log("check+link:",link);
/*eslint camelcase: [0, {properties: "never"}]*/
emailOptions.to = updateduser.email;
emailOptions.template = { 'name': 'verify' };
emailOptions.global_merge_vars = [];
emailOptions.global_merge_vars.push({
'name': 'USER_NAME',
'content': updateduser.name
|| updateduser.username || updateduser.email
});
emailOptions.global_merge_vars.push({
'name': 'LINK',
'content': link
});
Email.send(emailOptions, function () {});
deferred.resolve(true);
});
saveuserPromise.then(null, function (error) {
deferred.reject(error);
});
});
});
findByIduserPromise.then(null, function (error) {
deferred.reject(error);
});
return deferred.promise;
};
我正在为这类问题构建一个回购示例,因为它经常出现。你可以看看我现在在做什么。它还没有完成,因为我目前正在做它,但我希望在周五完成。听起来很棒。期待它。示例完成后,请对答案进行投票。您是否建议我们在应用程序中创建一个新的用户模型?为什么不能使用用户模型而不是用户模型?是的,我们建议您扩展内置用户模型,以便于配置。请注意,在
common/models
中没有User.json
或User.js
,因此使用User
扩展内置功能更容易,然后你可以修改common/models/user.js
和common/models/user.json
,就像修改任何其他脚手架模型一样。如果任何人有任何问题,请询问我