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