博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AngularJS+Satellizer+Node.js+MongoDB->Instagram-13
阅读量:6898 次
发布时间:2019-06-27

本文共 2363 字,大约阅读时间需要 7 分钟。

hot3.png

#13.Login 和 Signup 的 Express 路由

我们的 Login路由非常简单。它要做的仅仅是认证 email 和 password。如果两个都正确了,那么就返回一个新的令牌和用户对象。

把下面的路由接着加到我们上次的地方,在 isAuthenticated() 的后面。

app.post('/auth/login', function(req, res) { User.findOne({ email: req.body.email }, '+password', function(err, user) { if (!user) { return res.status(401).send({ message: { email: 'Incorrect email' } }); } bcrypt.compare(req.body.password, user.password, function(err, isMatch) { if (!isMatch) { return res.status(401).send({ message: { password: 'Incorrect password' } }); } user = user.toObject(); delete user.password; var token = createToken(user); res.send({ token: token, user: user }); }); });});

在查询中的 +password 参数告诉 Mongoose 结果中包含 password 字段。我们必须这样做,因为之前已经明确告诉 Mongoose 把 password 字段从所有查询结果的用户模型中去掉,通过设置 password: { type: String, select: false }

还记得我们在 Step 9 中创建 User 模型的时候,是怎样用 bcrypt 来做 password 字段的 hash 的吗?你看,我们检查两个密码是否匹配的时候,不能简单的用两个字符串来比较,需要用 bcrypt.compare() 。为了更好的说明这一点,看一下 文档的这个例子:

var hash = bcrypt.hashSync("bacon"); bcrypt.compareSync("bacon", hash); // truebcrypt.compareSync("veggies", hash); // false

如果用户给的 email 是存在的,并且密码也正确, 在 第 12-13 行 我们把 Mongoose Document object 转成纯 JavaScript 对象,然后删掉 password 属性。你可能会想知道为什么不直接删除 password 属性,还要先来一次转换。

事实上,Mongoose 返回的文档对象是不可辨的,所以即使你删掉 password 属性也改变不了什么。但是,你可以,通过在 Mongoose 查询中通过更详细的参数配置,也能达到同样的目的。不管哪种方法,对我们的结果都好用。

以这种方式创建 Incorrect email and Incorrect password 异常信息的原因,不单是要在 login form 上显示验证异常。这和通常的 form 把所有的异常都一溜显示出来的做法不同,异常信息会独立的现实在每个 form 字段下面。

https://hackhands.com/wp-content/uploads/2014/10/Screenshot-2014-10-27-00.32.32.png

然后是 signup 的路由。首先它检查是否输入了 email (不能有重复的 email)。然后它用 bcrypt 把 password 哈希之后保存到数据库。

signup 路由的代码如下:

app.post('/auth/signup', function(req, res) { User.findOne({ email: req.body.email }, function(err, existingUser) { if (existingUser) { return res.status(409).send({ message: 'Email is already taken.' }); } var user = new User({ email: req.body.email, password: req.body.password }); bcrypt.genSalt(10, function(err, salt) { bcrypt.hash(user.password, salt, function(err, hash) { user.password = hash; user.save(function() { var token = createToken(user); res.send({ token: token, user: user }); }); }); }); });});

注意: 该路由只负责通过 email 和 password 的 signup 处理。通过 Instagram 认证来创建一个新的账号,这是另一条完全不同的路由。

转载于:https://my.oschina.net/ilivebox/blog/374255

你可能感兴趣的文章
脚本中echo显示内容带颜色显示
查看>>
Android中Parcelable接口的使用
查看>>
我的友情链接
查看>>
java反射简单例子
查看>>
spring-session redis集群配置步骤总结
查看>>
Broadcom 4365(如:Dell vostro 3460)笔记本wifi无法使用解决办法
查看>>
LVS/DR+heartbeat实现高可用负载均衡服务
查看>>
单臂路由的原理及实验
查看>>
web前端开发中浏览器兼容问题(六)
查看>>
程序员应该怎样?
查看>>
离线快速部署Mirantis Openstack 9.0
查看>>
至少我还有腿
查看>>
怎样设计才能让文字排版更好看(三)
查看>>
【转】panabit+syslog打造中小型企业流量监控系统
查看>>
选高效服务器要精挑细选!擦亮双眼,拒绝杯具!
查看>>
Centos 7.1 RDO 安装 Liberty 问题及解决办法
查看>>
python制作的食物买卖存量计算程序
查看>>
yum命令——Linux下只下载不安装
查看>>
黑马程序员——集合篇
查看>>
memcached笔记
查看>>