使用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 創(chuàng)建一個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閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寡喝,死亡現場離奇詭異糙俗,居然都是意外死亡,警方通過查閱死者的電腦和手機预鬓,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門巧骚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人格二,你說我怎么就攤上這事劈彪。” “怎么了顶猜?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵沧奴,是天一觀的道長。 經常有香客問我长窄,道長滔吠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任挠日,我火速辦了婚禮疮绷,結果婚禮上,老公的妹妹穿的比我還像新娘嚣潜。我一直安慰自己冬骚,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只冻,像睡著了一般夜涕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上属愤,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天女器,我揣著相機與錄音,去河邊找鬼住诸。 笑死驾胆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的贱呐。 我是一名探鬼主播丧诺,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奄薇!你這毒婦竟也來了驳阎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤馁蒂,失蹤者是張志新(化名)和其女友劉穎呵晚,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體沫屡,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡饵隙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了沮脖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金矛。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勺届,靈堂內的尸體忽然破棺而出驶俊,到底是詐尸還是另有隱情,我是刑警寧澤免姿,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布饼酿,位于F島的核電站,受9級特大地震影響养泡,放射性物質發(fā)生泄漏嗜湃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一澜掩、第九天 我趴在偏房一處隱蔽的房頂上張望购披。 院中可真熱鬧,春花似錦肩榕、人聲如沸刚陡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐乳。三九已至歌殃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝙云,已是汗流浹背氓皱。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勃刨,地道東北人波材。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像身隐,于是被迫代替她去往敵國和親廷区。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345