使用node/koa/mongodb实现的jwt登录注册

node.js+koa+mongodb实现登录注册
思路 实现登录注册有三种方式 session和jwt 和oAuth(第三方登录) 我这里选用jwt
需要 :
中间件 koa-jwt 权限路由验证
jsonwebtoken 生成token
密码加密:
uuid ---唯一识别码
sha1 ---安全哈希算法
bcrypt ---加密算法 地址https://www.npmjs.com/package/bcrypt-nodejs
crypto ---加密算法
md5 --加密算法
json web token 传输方式
用md5/sha1+salt的方法保存密码是不安全的, 保存密码推荐用Bcrypt.
登录的几种实现方式
1.session 接收用户传过来的信息,存在session中,以cookie的方式传回给浏览器,cookie中有sessionId及值,
从http header中提取session Id ,根据session Id 从服务器端的hash中获取请求者身份
2.token 服务端收到信息后,将username转为userId 存储在jwt的payload中, 与头部进行base64编码进行签名,形成jwt,在cookie中保存,返回给浏览器,
浏览器每次请求都携带cookie,服务器对jwt进行解密,与服务器进行比较

项目流程
我使用了koa-generator脚手架, 热更新npm run dev ,服务器可以自动刷新,但是浏览器需要自己刷新

***********连接mongodb***************
0 用powershell运行似乎和cmd运行有点不一样
1 下载 安装
2 创建一个data文件夹来保存文件 目录C:\data\db 这是mongodb的默认路径
运行:C:\mongodb\bin\mongod --dbpath c:\data\db 连接C:\mongodb\bin\mongo.exe
3 一些帮助db.help() db.stats()查看 show dbs
4 切换数据库 use mydb
5 Mongoose是MongoDB的一个对象模型工具,Mongoose,因为封装了对MongoDB对文档操作的常用处理方法,可以高效的操作mongodb象模型工具,Mongoose,
因为封装了对MongoDB对文档操作的常用处理方法,可以高效的操作mongodb,同时可以理解mongoose是一个简易版的orm

6 app.js 连接数据库

var mongoose = require('mongoose')
mongoose.connect("mongodb://127.0.0.1:27017/user", { //mongoose.connect
  useNewUrlParser: true
});
// MongoDB连接成功后回调,这里仅输出一行日志
mongoose.connection.on('connected', function () { //mongoose.connection
  console.log('sucess 192.168.1.29:27017/user');
});

// MongoDB连接出错后回调,这里仅输出一行日志
mongoose.connection.on('error', function (err) {
  console.log(' error: ' + err);
});

// MongoDB连接断开后回调,这里仅输出一行日志
mongoose.connection.on('disconnected', function () {
  console.log(' disconnected');
});

7 和koa连接是使用mongoose,根目录下新建一个models文件夹,这里放置数据模型,

models/userinfo.js文件
var mongoose = require('mongoose')
var schema = mongoose.Schema
const userinfo = new schema({
    'username': String,
    'password': String
})
const user = mongoose.model('userinfo', userinfo)
module.exports = user

**************koa-router 使用**************
//引入和获取一个router实例

router.get('/')
router.post('/')
router.use(userinfo.routes(), userinfo.allowedMethods())
router.use(home.routes(), home.allowedMethods())

这里可以把router分文件写,然后写一个index汇总,在app.js里引入

在router文件夹里面router/user.js
登录注册的主要思路是注册时给密码加密(忽略验证等其他方面的),然后登录时验证如果密码匹配就返回token,然后如果有鉴权的需要,则前端每个http请求需要在header中携带token,
然后node后端中验证token是否有效,这个验证koa-jwt已经在作用了,对于token登出这一块,需要存储token,然后比对,前后端都清除,还有一种是不存储token,设置过期时间,仅前端登出
//登录

router.post('/login', async (ctx, next) => {
  const userinfos = await user.findOne({
    username: ctx.request.body.username
  })

  const compare = await bcrypt.compare(ctx.request.body.password, userinfos.password)
  if (compare) {
    ctx.body = {
      code: 1,
      msg: '登录成功!',
      token: jsonwebtoken.sign({
        data: userinfos.username,
        exp: Math.floor(Date.now() / 1000) + (60 * 60)
      }, 'secret')
    }
  } else {
    ctx.body = {
      code: 0,
      msg: '登录失败!'
    }
  }
})
//注册
router.post('/register', async (ctx, next) => {
  //判断和唯一识别码
  const {
    body
  } = ctx.request
  body.password = await bcrypt.hash(ctx.request.body.password, 10)
  const res = await user.create(body)
  if (res) {
    ctx.body = {
      code: 1,
      msg: '注册成功!'
    }
  } else {
    ctx.body = {
      code: 0,
      msg: '注册失败!'
    }
  }
})

*****路由鉴权*****

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