node登錄生成token并驗(yàn)證的實(shí)現(xiàn)
一、基礎(chǔ)概念
"token": 是一個(gè)通用的術(shù)語(yǔ),指代一種用于表示身份、權(quán)限或訪問憑證的數(shù)據(jù)結(jié)構(gòu)。它可以是一個(gè)字符串、數(shù)字或其他形式的數(shù)據(jù)。
主要用途:
身份驗(yàn)證:在身份驗(yàn)證過程中,用戶提供憑據(jù)(如用戶名和密碼),服務(wù)器驗(yàn)證憑據(jù)的有效性后會(huì)頒發(fā)一個(gè)身份驗(yàn)證令牌給用戶。這個(gè)令牌可以是一個(gè)長(zhǎng)期有效的持久令牌,也可以是一個(gè)短期有效的臨時(shí)令牌,用于后續(xù)的請(qǐng)求中證明用戶的身份。
授權(quán)訪問:當(dāng)用戶通過身份驗(yàn)證后,服務(wù)器可以頒發(fā)一個(gè)訪問令牌給用戶。這個(gè)令牌用于證明用戶被授予了特定的權(quán)限或訪問特定資源的權(quán)利。用戶在后續(xù)請(qǐng)求中使用該令牌來訪問受保護(hù)的資源,服務(wù)器會(huì)驗(yàn)證令牌的有效性和權(quán)限。
API 訪問:在應(yīng)用程序開發(fā)中,API 令牌通常用于授權(quán)第三方應(yīng)用程序或服務(wù)來訪問特定的 API。開發(fā)者向 API 提供商注冊(cè)應(yīng)用程序,并獲得一個(gè) API 令牌,以便在應(yīng)用程序中進(jìn)行身份驗(yàn)證和授權(quán),以訪問和使用 API 提供的功能和數(shù)據(jù)。
簡(jiǎn)單來說,就是本次登錄的一個(gè)憑證,只要你帶著服務(wù)器端返回來的token你就可以訪問當(dāng)前相對(duì)應(yīng)的內(nèi)容(具體還需要服務(wù)端來定)。
二、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過期或驗(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ù)返回出來,就可以當(dāng)時(shí)生成token傳過去的數(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)文章
使用NVM實(shí)現(xiàn)不同nodejs版本的自由切換
在工作中,我們可能需要同時(shí)進(jìn)行多個(gè)不同NodeJS版本的項(xiàng)目開發(fā),這種情況下,對(duì)于維護(hù)多個(gè)版本的node將會(huì)是一件非常麻煩的事情,NVM就是為解決這個(gè)問題而產(chǎn)生的,本文給出了下載、安裝及使用方法,需要的朋友可以參考下2024-02-02
詳解nodejs通過代理(proxy)發(fā)送http請(qǐng)求(request)
本篇文章主要介紹了nodejs通過代理(proxy)發(fā)送http請(qǐng)求(request),具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
Node+Express搭建HTTPS服務(wù)的實(shí)現(xiàn)
最近開發(fā)需要搭建一個(gè)https的服務(wù),正好最近在用nodejs和express,本文章主要介紹了Node+Express搭建HTTPS服務(wù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
使用PM2實(shí)現(xiàn)高效的應(yīng)用監(jiān)控與管理功能
PM2?是一個(gè)流行的進(jìn)程管理器,用于?Node.js?應(yīng)用程序,它支持應(yīng)用程序的負(fù)載均衡、自動(dòng)重啟、日志管理、監(jiān)控以及多環(huán)境管理等功能,本文給大家介紹了如何使用PM2實(shí)現(xiàn)高效的應(yīng)用監(jiān)控與管理功能,需要的朋友可以參考下2024-02-02
修改Nodejs內(nèi)置的npm默認(rèn)配置路徑方法
今天小編就為大家分享一篇修改Nodejs內(nèi)置的npm默認(rèn)配置路徑方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
node如何實(shí)現(xiàn)把包發(fā)布到npm上
這篇文章主要介紹了node如何實(shí)現(xiàn)把包發(fā)布到npm上的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05

