2014-12-04 63 views
4

我目前正在开发API。我正在使用Strongloop(Loopback)。使用Strongloop回送进行电子邮件验证 - 验证令牌返回

我正在尝试为用户注册时执行电子邮件验证。我有一个扩展内置“用户”模型的“用户”模型。

现在,当用户注册(POST /用户)时,通过链接发送电子邮件给/ users /用三个适当的参数确认,即uid,重定向和令牌。当用户点击链接时,后者的电子邮件地址被正确验证(emailVerification字段变为真)。

但是,我注意到,当在/ users上发出POST请求时,响应包含验证令牌。这是正常的吗?是不是只能通过发送的电子邮件访问验证令牌?

因为实际上,通过在/ users上发出POST请求并在响应中获取验证令牌,可以轻松地向用户发送另一个请求/使用适当的参数(包括验证令牌)进行确认并验证电子邮件地址,即使地址不存在。

我是Strongloop的新手,也许我错过了一些东西。你们能帮忙吗?

+0

我正在建立一个电子商务xample回购这些类型的问题,因为它经常出现。您可以通过https://github.com/strongloop/loopback-faq-user-management查看我现在拥有的内容。目前尚未完成,但我希望在周五之前完成。 – superkhau 2014-12-04 08:10:35

+0

听起来不错。期待它。 – user2483431 2014-12-04 08:30:22

+0

示例已完成,请提出答案。 – superkhau 2014-12-10 08:09:40

回答

4

我刚刚完成了这个例子。请参阅:

https://github.com/strongloop/loopback-faq-user-management

+0

您是否建议我们在应用程序中创建新的用户模型?为什么不能使用用户模型而不是用户模型? – 2015-08-11 16:49:59

+0

是的,我们建议您扩展内置的用户模型以便于配置。注意''common/models'中没有'User.json'或'User.js',所以用'user'扩展内建就容易多了,那么你可以修改'common/models/user.js'和'common/models/user.json',就像你使用其他脚手架模型一样。 – superkhau 2015-08-11 19:07:40

0

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

希望这有助于!

2

如果你想创建用户注册验证链接,但不使用内置的用户模式,那么你需要创建验证令牌,然后发送链接。我已经添加了这两种方法。你还需要使用远程方法和一个争论谁是对象类型:在您需要使用寄存器email.the方法发送的参数是这样的....在这里我们使用用户=任何变量名,modelN =型号名称

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; 
}; 
+0

如果任何身体有任何问题,然后问我 – 2016-06-30 13:23:31