node登錄生成token并驗(yàn)證的實(shí)現(xiàn)
一、基礎(chǔ)概念
"token": 是一個(gè)通用的術(shù)語(yǔ),指代一種用于表示身份、權(quán)限或訪問(wèn)憑證的數(shù)據(jù)結(jié)構(gòu)。它可以是一個(gè)字符串、數(shù)字或其他形式的數(shù)據(jù)。
主要用途:
身份驗(yàn)證:在身份驗(yàn)證過(guò)程中,用戶提供憑據(jù)(如用戶名和密碼),服務(wù)器驗(yàn)證憑據(jù)的有效性后會(huì)頒發(fā)一個(gè)身份驗(yàn)證令牌給用戶。這個(gè)令牌可以是一個(gè)長(zhǎng)期有效的持久令牌,也可以是一個(gè)短期有效的臨時(shí)令牌,用于后續(xù)的請(qǐng)求中證明用戶的身份。
授權(quán)訪問(wèn):當(dāng)用戶通過(guò)身份驗(yàn)證后,服務(wù)器可以頒發(fā)一個(gè)訪問(wèn)令牌給用戶。這個(gè)令牌用于證明用戶被授予了特定的權(quán)限或訪問(wèn)特定資源的權(quán)利。用戶在后續(xù)請(qǐng)求中使用該令牌來(lái)訪問(wèn)受保護(hù)的資源,服務(wù)器會(huì)驗(yàn)證令牌的有效性和權(quán)限。
API 訪問(wèn):在應(yīng)用程序開(kāi)發(fā)中,API 令牌通常用于授權(quán)第三方應(yīng)用程序或服務(wù)來(lái)訪問(wèn)特定的 API。開(kāi)發(fā)者向 API 提供商注冊(cè)應(yīng)用程序,并獲得一個(gè) API 令牌,以便在應(yīng)用程序中進(jìn)行身份驗(yàn)證和授權(quán),以訪問(wèn)和使用 API 提供的功能和數(shù)據(jù)。
簡(jiǎn)單來(lái)說(shuō),就是本次登錄的一個(gè)憑證,只要你帶著服務(wù)器端返回來(lái)的token你就可以訪問(wèn)當(dāng)前相對(duì)應(yīng)的內(nèi)容(具體還需要服務(wù)端來(lái)定)。
二、JTW
token本身就是一個(gè)加密字符串,但是由自己生成需要考慮到安全性、加密算法等,但我們可以使用插件 例如jsonwebtoken就可以幫助我們token并驗(yàn)證。
npm install jsonwebtoken
生成token
語(yǔ)法:JWT.sign(數(shù)據(jù),加密字符串, 時(shí)間)
const JWT = require("../../utils/JWT.js") let token = JWT.sign({ username:'奧特曼',id:123 },'secret', '1day')
驗(yàn)證token
語(yǔ)法:jwt.verify(生成的token,加密字符串)
jwt.verify(token,'secret')
三、實(shí)踐
封裝
const jwt = require('jsonwebtoken') const secret = "ultraman"http://解密密鑰 const JWT = { createToken: (data,time) => { return jwt.sign(data,secret,{expiresIn:time}) }, verifyToken: (token) => { // 如果token過(guò)期或驗(yàn)證失敗,將返回false try { return jwt.verify(token,secret) } catch (error) { return false } } } module.exports = JWT
登錄接口
login: async (req, res, next) => { var result = await UserService.login(req.body) if (result.length) { // 生成token const DeepRes = JSON.parse(JSON.stringify(result[0])) delete DeepRes.password let token = JWT.createToken({ username: req.body.username,id:result[0]._id }, '1day') res.header('Authorization', token) res.send({code:200,msg:'登錄成功',data:{token,userInfo:DeepRes}}) } else { res.send({code:500,msg:'賬號(hào)或密碼錯(cuò)誤'}) } console.log(result,'登陸了'); },
驗(yàn)證攔截
驗(yàn)證中用了截取,采用了Bearer xxxx 的形式,所以做了截取只保留token部分進(jìn)行驗(yàn)證。
app.use((req, res, next) => { if (whiteList.includes(req.path)) return next() let token = req.get('Authorization') if (token) { const result = JWT.verifyToken(token.split(' ')[1]) if (result) { next() } else { res.status(401).send({ code: 401, msg: '登錄信息已失效,請(qǐng)重新登錄' }) } } else { res.send({ code: 500, msg: '未攜帶token' }) } })
驗(yàn)證后會(huì)把數(shù)據(jù)返回出來(lái),就可以當(dāng)時(shí)生成token傳過(guò)去的數(shù)據(jù),有了數(shù)據(jù)那么我們就可以自行獲取用戶信息
token獲取個(gè)人信息
getUserInfo: async (req, res, next) => { let token = req.get('Authorization') const info = JWT.verifyToken(token.split(' ')[1]) const userInfo = await UserService.getProfile(info.id) console.log(userInfo, 'userInfo'); res.send({code:200,msg:'獲取成功',data:{userInfo:userInfo[0]}}) }
到此這篇關(guān)于node登錄生成token并驗(yàn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)node登錄生成token驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解使用vscode+es6寫nodejs服務(wù)端調(diào)試配置
本篇文章主要介紹了使用vscode+es6寫nodejs服務(wù)端調(diào)試配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09使用Node.js實(shí)現(xiàn)一個(gè)簡(jiǎn)單的FastCGI服務(wù)器實(shí)例
這篇文章主要介紹了使用Node.js實(shí)現(xiàn)一個(gè)簡(jiǎn)單的FastCGI服務(wù)器實(shí)例,也可以作為一個(gè)比較詳細(xì)的Node.js服務(wù)器創(chuàng)建教程,需要的朋友可以參考下2014-06-06使用Nodejs連接mongodb數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用Nodejs連接mongodb數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-08-08解決nodejs報(bào)錯(cuò)Error:EPERM:operation not permitted,mkdi
這篇文章主要介紹了解決nodejs報(bào)錯(cuò)Error:EPERM:operation not permitted,mkdir‘xxxxxxxxxxxxxxxx‘問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Node.js項(xiàng)目依賴問(wèn)題的詳細(xì)解決步驟
在現(xiàn)代前端開(kāi)發(fā)中,Node.js 和 npm 是不可或缺的工具,然而,隨著項(xiàng)目的迭代和依賴包的更新,我們常常會(huì)遇到依賴沖突、構(gòu)建失敗等問(wèn)題,本文將通過(guò)一個(gè)實(shí)際案例,詳細(xì)講解如何解決 Node.js 項(xiàng)目中的依賴問(wèn)題,包括升級(jí) Node.js 和 npm、替換過(guò)時(shí)的依賴包、修復(fù)構(gòu)建錯(cuò)誤等2025-02-02sublime text配置node.js調(diào)試(圖文教程)
下面小編就為大家分享一篇sublime text配置node.js調(diào)試(圖文教程),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11node.js連接mongoDB數(shù)據(jù)庫(kù) 快速搭建自己的web服務(wù)
這篇文章主要為大家詳細(xì)介紹了node.js連接mongoDB數(shù)據(jù)庫(kù),如何快速搭建自己的web服務(wù),感興趣的小伙伴們可以參考一下2016-04-04iOS + node.js使用Socket.IO框架進(jìn)行實(shí)時(shí)通信示例
本篇文章主要介紹了iOS + node.js使用Socket.IO框架進(jìn)行實(shí)時(shí)通信示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04