Node.js学习:使用loopback做邮箱验证

注册用户

LoopBack用户模型提供了注册新用户并确认其电子邮件地址的方法。您还可以使用loopback-component-passport模块将登录信息与Facebook,Google和其他第三方提供商集成。

使用LoopBack用户模型注册用户

创建新用户

a. 通过添加模型实例创建用户(注册用户),电子邮件和密码是唯一必需的属性。

/server/boot/my-boot-script.js

module.exports = function(app) {
  var User = app.models.User;
  User.create({email: 'foo@bar.com', password: 'bar'}, function(err, userInstance) {
    console.log(userInstance);
  });
  //...

注:如果/boot文件夹中没有这个js文件,可以自己新建一个my-boot-script.js。这个文件夹中脚本的作用是执行一些初始化的设置。默认情况下,运行引导脚本后,应用程序在启动时会自动执行该文件夹中的脚本。

b. 使用POST /users接口创建一个新的用户实例,例如:

curl -X POST -H "Content-Type:application/json"         \
-d '{"email": "me@domain.com", "password": "secret"}'   \
http://localhost:3000/api/users

添加其他注册限制

我们可能会在注册过程中添加方法,比如查看给定的用户名是否可用,或者是否已经注册了一个电子邮件地址。通常做法是在User对象上添加一个beforeRemote方法。

验证电子邮件地址

通常,应用程序将要求用户在登录之前验证其电子邮件地址。所以我们需要向用户发送一封包含链接的电子邮件,来验证其地址。一旦用户点击链接,他们就会被重定向到网站的登录页面(“/”),并且将能够正常登录。

如果需要强制验证注册,请在server/model-config.json中将emailVerificationRequired用户模型属性设置为true;

server/model-config.json

...
"user": {
    "dataSource": "db",
    "public": true,
    "options": {
      "emailVerificationRequired": true
    }
...

通过REST,使用GET /users/confirm接口来验证用户的电子邮件地址。

此示例在User模型上创建了一个远程钩子,并在create()方法被调用之后执行。

/common/models/user.js

var config = require('../../server/config.json');
var path = require('path');

module.exports = function(user) {
  //send verification email after registration
  user.afterRemote('create', function(context, userInstance, next) {
    console.log('> user.afterRemote triggered');

    var options = {
      type: 'email',
      to: userInstance.email,
      from: 'noreply@loopback.com',
      subject: 'Thanks for registering.',
      template: path.resolve(__dirname, '../../server/views/verify.ejs'),
      redirect: '/verified',
      user: user
    };

    userInstance.verify(options, function(err, response, next) {
      if (err) return next(err);

      console.log('> verification email sent:', response);

      context.res.render('response', {
        title: 'Signed up successfully',
        content: 'Please check your email and click on the verification link ' -
            'before logging in.',
        redirectTo: '/',
        redirectToLinkText: 'Log in'
      });
    });
  });
...

有关完整的示例,请参阅loopback-example-user-management中的user.js。

接下来,我们将以loopback-example-user-management为例,详细地完成验证邮箱的过程。

首先需要在/server/model-config.json里配置邮件数据源。

/server/model-config.json

···
"Role": {
  "dataSource": "db",
  "public": false
},
"Email": {
  "dataSource": "emailDs"
},
"user": {
  "dataSource": "db",
  "public": true,
  "options": {}
}
···

接下来配置/server/datasources.json文件,即配置邮件数据源,示例项目中的代码如下:

"emailDs": {
  "name": "emailDs",
  "connector": "mail",
  "transports": [
    {
      "type": "smtp",
      "host": "smtp.gmail.com",
      "secure": true,
      "port": 465,
      "tls": {
        "rejectUnauthorized": false
      },
      "auth": {
        "user": "email@address.com",
        "pass": "password"
      }
    }
  ]
}

这里需要改两个地方,一个是host要改成你指定的源地址,如果是gmail邮箱,就写成smtp.gmail.com,如果是qq邮箱,就改成smtp.qq.com。另外一个改动是auth中的user和pass,这里写的是用于发送邮件的邮箱的邮箱名和密码,也就是设置用这个邮箱给注册的用户邮箱发送邮件。

现在运行项目,打开http://localhost:3000/explorer,我们现在在API explorer中注册一个用户。

它将返回一个提示网页,这表示验证邮件已经成功发到了注册的邮箱中。

打开邮箱,激活链接,再次登录即可成功。

现在回到explorer,使用登录接口。

返回的参数中,id为返回的token,ttl为token默认的有效周期,可以手动修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容