二、node系列之数据接口注册接口的实现(token验证登陆)

1、使用express脚手架创建项目

// 安装脚手架,只需安装一次
npm i express-generator -g
// 创建express项目
express myapp --view=ejs
cd myapp
// 安装依赖
npm i 
// 安装需要使用的模块
// 数据库模块 用户唯一id模块 密码加密模块 token模块
npm i mongoose node-uuid bcryptjs jsonwebtoken -S

2、了解项目的目录结构

  • bin
    www ------- 服务器启动
  • node_modules ------- 项目的依赖文件
  • public ------- 静态资源文件夹
    images ------- 静态图片
    javascripts ------- 静态的js文件
    stylesheets ------- 静态的样式表文件
  • routes ------- 路由文件
    index.js ------- 默认的路由
    users.js ------- 用户相关的路由
  • views ------- 路由对应的页面
    index.ejs ------- 默认的首页
    error.ejs ------- 错误页面
    app.js ------- 使用中间件,注册路由
    package.json ------- 描述文件

3、准备数据库相关文件

大勋在node系列之数据库mongoose的封装中给大家介绍了如何封装mongoose,可以先行查看如何封装,封装的文件夹为sql,如果不想看的,可以直接通过网盘下载该文件夹

将该sql文件放置项目的跟目录下

- myapp
	- sql
		- collection
			users.js
		db.js
		index.js

4、编写注册接口

  • 目标文件: myapp/routes/users.js

  • 实现思路:使用post提交数据的方式,先以手机号查询有没有该用户,如果有该用户,提示用户该账号已经注册过了;如果没有该用户,则可以完成注册,首先得将密码加密,加密完成后插入数据库

  • 代码实现:

// 找到用户集合
var User = require('./../sql/collection/users');
// 找到数据库封装文件
var sql = require('./../sql');
// 状态码的封装
var utils = require('./../utils')
// 用户唯一标识的id
var uuid = require('node-uuid');
// 密码加密模块
var bcrypt = require('bcryptjs');
var salt = bcrypt.genSaltSync(10); // 加密级别

// 实现注册接口 -- post提交方式
router.post('/register', (req, res, next) => {
  // 1、先获取表单信息
  let { username, password, tel } = req.body;
  // 2、根据手机号查询 用户集合中是否有该用户,如果有,返回有该账户,如果没有注册继续
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    // 2.1 判断有没有该用户
    if (data.length === 0) {
      // 2.2 没有该用户----继续完成注册操作
      // 2.2.1 生成用户的id
      let userid = 'users_' + uuid.v1();
      // 2.2.2 对密码加密
      password = bcrypt.hashSync(password, salt)
      // 2.2.3 插入数据库
      sql.insert(User, { userid, username, password, tel}).then(() => {
        res.send(utils.registersuccess)
      })
    } else {
      // 2.3 已有该用户
      res.send(utils.registered)
    }
  })
})
  • 附 状态码封装模块 myapp/utils/index.js
module.exports = {
  registered: {
    code: '10000',
    message: '该用户已注册,请直接登录' 
  },
  registersuccess: {
    code: '10101',
    message: '注册成功' 
  }
}

5、编写登陆接口

  • 目标文件 myapp/routes/users.js
  • 实现思路:根据手机号查询有没有该用户,如果没有,提示用户未注册,如果有该用户,使用bcryptjs模块验证密码的有效性,如果有效,生成token,返回给前端相应的token值。
var jwt = require('jsonwebtoken');
// 实现登陆功能
router.post('/login', (req, res, next) => {
  // 1、获取表单信息
  let { tel, password } = req.body;
  // 2、依据手机号查询有没有该用户
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    // 2.1 判断有么有该用户
    if (data.length === 0) {
      // 2.2 没有该用户
      res.send(utils.unregister)
    } else {
      // 2.3 有该用户,验证密码
      // 2.3.1 获取数据库中的密码
      let pwd = data[0].password;
      // 2.3.2 比较 输入的 密码和数据库中的密码
      var flag = bcrypt.compareSync(password, pwd) // 前为输入,后为数据库
      if (flag) {
        // 2.3.3 密码正确,生成token
        let userid = data[0].userid
        let username = data[0].username
        let token = jwt.sign({ userid, username }, 'daxunxun', {
          expiresIn: 60*60*24// 授权时效24小时
        })
        res.send({
          code: '10010',
          message: '登陆成功',
          token: token
        })
      } else {
        // 2.3.4 密码错误
        res.send({
          code: '10100',
          message: '密码错误'
        })
      }
    }
  })
})

6、验证登陆实现

  • 目标文件: myapp/app.js
  • 实现思路:很多的数据请求都需要登陆之后才能获取到,在此统一封装验证登陆
// 引入token模块
var jwt = require('jsonwebtoken');
// 全局的路由匹配
app.use((req, res, next) => {
 // 排除登陆注册页面
  if (req.url !== '/users/login' && req.url !== '/users/register') {
  // 不同形式获取token值
    let token = req.headers.token || req.query.token || req.body.token;
    // 如果存在token ---- 验证
    if (token) {
      jwt.verify(token, 'daxunxun', function(err, decoded) {
        if (err) {
          res.send({ 
            code: '10119', 
            message: '没有找到token.' 
          });
        } else {
          req.decoded = decoded;  
          console.log('验证成功', decoded);
          next()
        }
      }) 
    } else { // 不存在 - 告诉用户---意味着未登录
      res.send({ 
        code: '10119', 
        message: '没有找到token.' 
      });
    }
  } else {
    next()
  }
})

7、预告

下次分享node系列之产品数据的excel数据导入以及查询

  • 27
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,首先我们需要安装一些依赖: - express:用于搭建服务器; - body-parser:用于解析请求体中的数据; - jsonwebtoken:用于生成和验证 token。 可以使用以下命令安装: ``` npm install express body-parser jsonwebtoken ``` 接下来就可以开始写代码了。 首先创建一个 `index.js` 文件: ``` const express = require('express'); const bodyParser = require('body-parser'); const jwt = require('jsonwebtoken'); const app = express(); app.use(bodyParser.json()); const JWT_SECRET = 'mysecretkey'; app.post('/api/login', (req, res) => { const { username, password } = req.body; // 这里需要根据实际情况验证用户名和密码是否正确 if (username === 'admin' && password === 'admin') { const token = jwt.sign({ username }, JWT_SECRET); res.json({ token }); } else { res.status(401).json({ message: '用户名或密码错误' }); } }); app.post('/api/register', (req, res) => { // 这里需要根据实际情况处理注册逻辑 res.json({ message: '注册成功' }); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 上面的代码中,我们使用了 `jsonwebtoken` 生成了一个 token,并将其返回给客户端。客户端以后可以使用这个 token 发送请求。 接下来,需要编写 token 验证的中间件: ``` function auth(req, res, next) { const authHeader = req.headers.authorization; if (authHeader) { const token = authHeader.split(' ')[1]; try { const decoded = jwt.verify(token, JWT_SECRET); req.user = decoded; next(); } catch (err) { res.status(401).json({ message: '无效的 token' }); } } else { res.status(401).json({ message: '未提供 token' }); } } ``` 这个中间件会检查请求头中是否包含 token,如果包含则验证 token 的有效性,并将解码后的用户信息保存到 `req.user` 中。 最后,我们编写一个需要认证的 API 接口: ``` app.get('/api/profile', auth, (req, res) => { res.json({ username: req.user.username }); }); ``` 这个接口需要认证,需要通过 `auth` 中间件验证用户的 token。 至此,我们已经完成了登录注册和认证的接口编写。如果需要更复杂的功能,可以根据实际情况进行扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值