【架構師(第四十二篇)】服務端開發(fā)之常用的登錄鑒權方式
了解Web常用的登錄鑒權方式
主要內容cookie和session
JWT
SSO和OAuth2
關于短信驗證碼用戶體驗好,無需注冊,無需記住密碼
驗證碼需要收費,所以需要防止惡意共計,惡意刷接口
介紹Session登錄cookie做登錄校驗的過程前端輸入用戶名密碼,傳給后端
后端驗證成功,返回信息時set-cookie
接下來的所有接口訪問,都自動帶上cookie
為何會有Sessioncookie只存儲userId,不暴露用戶信息
用戶信息存儲在session中
Session的優(yōu)點原理簡單,易于學習
用戶信息存儲在服務端,可以快速封禁某個登錄的用戶
Session的缺點占用服務端內存,有硬件成本
多進程,多服務器時,不好同步,一般使用第三方redis存儲,成本高
跨域傳遞cookie,需要特殊配置
介紹JWT登錄JWT的全稱是JSON?WebToken
JWT的過程前端輸入用戶名密碼,傳遞給后端
后端驗證成功,返回一段token字符串,將用戶信息加密之后得到的結果
前端獲取token之后,存儲下來
以后訪問接口,都在header中攜帶這段token
JWT的優(yōu)點不占用服務器內存
多進程,多服務器,不受影響
不受跨域限制
JWT的缺點無法快速封禁登錄的用戶
JWT和Session的重要區(qū)別JWT用戶信息存儲在客戶端
Session用戶信息存儲在服務器端
為何選擇JWT沒有快速封禁登錄用戶的需求
JWT成本低,維護簡單
需要考慮跨域的擴展性
代碼演示安裝npm插件,koa-jwt、jsonwebjson
封裝jwt中間件,并使用
封裝loginCheck中間件
相關的配置項,構造函數(shù)等
安裝插件npmikoa-jwtjsonwebtoken-S封裝jwt中間件增加配置
//src\config\constant.jsmodule.exports={//jwt秘鑰JWT_SECRET:'warbler_for-json#web$token',//jwt忽略默認驗證的path:全部忽略即可,需要登錄驗證的,用自己封裝的loginCheckJWT_IGNORE_PATH:[/\//],}封裝中間件
//src\middlewares\jwt.jsconstjwtKoa=require('koa-jwt')const{JWT_SECRET,JWT_IGNORE_PATH}=require('../config/constant')constjwt=jwtKoa({secret:JWT_SECRET,//jwt秘鑰cookie:'jwt_token',//使用cookie存儲token}).unless({//定義哪些路由忽略jwt驗證path:JWT_IGNORE_PATH,})module.exports=jwt使用
//src\app.jsconstjwt=require('./middlewares/jwt')//配置jwt中間件app.use(jwt)封裝JWT工具//src\utils\jwt.jsconstutil=require('util')constjwt=require('jsonwebtoken')//jwt密鑰const{JWT_SECRET}=require('../config/constant')//jwt過期時間const{jwtExpiresIn}=require('../config/index')constverify=util.promisify(jwt.verify)/***jwtverify解密*@param{string}tokentoken*/asyncfunctionjwtVerify(token){constdata=awaitverify(token.split('')[1],JWT_SECRET)//去掉前面的Bearerreturndata}/***jwtsign加密*@param{Object}datadata*/functionjwtSign(data){consttoken=jwt.sign(data,JWT_SECRET,{expiresIn:jwtExpiresIn})returntoken}//導出解密,加密兩個方法module.exports={jwtVerify,jwtSign,}封裝loginCheck中間件封裝數(shù)據(jù)模型
//srces-model\index.js/***基礎模型,包括errnodata和message*/classBaseRes{constructor({errno,data,message}){this.errno=errnoif(data){this.data=data}if(message){this.message=message}}}/***執(zhí)行失敗的數(shù)據(jù)模型*/classErrorResextendsBaseRes{constructor({errno=-1,message='',data},addMessage=''){super({errno,message:addMessage?`${message}-${addMessage}`//有追加信息:message,data,})}}/***執(zhí)行成功的數(shù)據(jù)模型*/classSuccessResextendsBaseRes{constructor(data={}){super({errno:0,data,})}}module.exports={ErrorRes,SuccessRes,}封裝錯誤信息集合
//srces-model\failInfo\error.jsmodule.exports={//統(tǒng)一錯誤處理serverErrorFailInfo:{errno:-1,message:'運行錯誤',},//404notFoundFailInfo:{errno:-2,message:'404NotFound',},}封裝中間件
//src\middlewares\loginCheck.js//解密const{jwtVerify}=require('../utils/jwt')//執(zhí)行失敗的數(shù)據(jù)模型const{ErrorRes}=require('../res-model/index')//錯誤信息集合const{loginCheckFailInfo}=require('../res-model/failInfo/index')/***登錄校驗*@param{Object}ctxctx*@param{function}nextnext*/module.exports=asyncfunctionloginCheck(ctx,next){//失敗信息consterrRes=newErrorRes(loginCheckFailInfo)//獲取tokenconsttoken=ctx.header.authorizationif(!token){ctx.body=errResreturn}letflag=truetry{constuserInfo=awaitjwtVerify(token)deleteuserInfo.password//屏蔽密碼//驗證成功,獲取userInfoctx.userInfo=userInfo}catch(ex){flag=falsectx.body=errRes}if(flag){//繼續(xù)下一步awaitnext()}}介紹SSO和OAuth2SSO單點登錄
OAuth2第三方鑒權
使用cookie實現(xiàn)單點登錄簡單的,如果業(yè)務系統(tǒng)都在同一主域名下,比如wenku.baidu.com、tieba.baidu.com,就可以直接把cookiedomain設置為主域名baidu.com,百度也就是這么干的
SSOOAuth2SSO是OAuth2的實際案例,其他常見的還有微信登錄,github登錄等,當涉及到第三方用戶登錄校驗時,都會使用OAuth2標準。
原文:https://juejin.cn/post/7113190886875332638【架構師(第四十二篇)】服務端開發(fā)之常用的登錄鑒權方式
OAuth2第三方鑒權 使用cookie實現(xiàn)單點登錄簡單的,如果業(yè)務系統(tǒng)都在同一主域名下,比如wenku.baidu.com、tieba.baidu.com,就可以直接把cookiedomain設置為主域名baidu.com,百度也就是這么干的 SSO OAuth2SSO是OAuth2的實際案例,其他常見的還有微信登錄,github登錄等,當涉及到第三方用戶登錄校驗時,都會...
相關評說:
揭西縣并聯(lián): ______ 軟件工程師的技術要求是比較全面的,除了最基礎的編程語言(C語言/C++/JAVA等)、數(shù)據(jù)庫技術(SQL/ORACLE/DB2等)等,還有諸多如JAVASCRIPT、AJAX、HIBERNATE、SPRING等前沿技術.此外,關于網(wǎng)絡工程和軟件測試的其他技術也要有所涉獵.
揭西縣并聯(lián): ______ 簡單點說,企業(yè)需要一個商務智能系統(tǒng)BI系統(tǒng)的時候 就需要一個技術比較全面,比較有經(jīng)驗的人員---架構師 , 來構架這個BI系統(tǒng), 從底層的數(shù)據(jù)抽取 再到數(shù)據(jù)倉庫的建立, 以及挖掘,還有前段展現(xiàn)等等, 負責整個系統(tǒng)的架構
揭西縣并聯(lián): ______ 如果現(xiàn)在還有惡露就不要洗里面,沒有就可以洗,倒開水冷溫了洗洗外面,不要冷水熱水摻和,早晚各洗一次,每次倒三瓶蓋洗液
揭西縣并聯(lián): ______ 這個情況多由于鈣劑攝入不足或消耗過多引起的情況的.現(xiàn)在的情況建議到醫(yī)院檢查一下微量元素的情況,在明確屬于缺鈣的情況后就建議在醫(yī)生的指導下服用樂力鈣魚肝油做調節(jié)治療,同時注意適當?shù)亩喑砸恍┑澳倘忸愂澄?注意避免吃膨化食品,避免吃油炸食品為宜.
揭西縣并聯(lián): ______ 系統(tǒng)分析師的基本職責是從事管理信息系統(tǒng)的定制、企業(yè)資源管理系統(tǒng)的設計開發(fā)及市場評估策劃,要求計算機或數(shù)理學或工科專業(yè)、本科以上學歷,能獨立翻譯、閱讀國外技術資料,能熟練運用一些編程語言進行軟件開發(fā)
揭西縣并聯(lián): ______ 軟件開發(fā)不能和建房子完全類比,軟件開發(fā)的設計和實施往往是分不開的,不可能有人畫好圖紙,再由人搬磚來實現(xiàn)代碼.全棧工程師和構架師并不存在高下之分,分工不同而,只不過成為構架師所需要掌握的知識更特殊,而且也更依賴經(jīng)驗....
揭西縣并聯(lián): ______ 可以的,一般是在一個月以上就可以的,每個地方風俗都是不同的,坐月子應該多注意休息的,注意保暖了,不吃辛辣的食物的.
揭西縣并聯(lián): ______ 在尋找優(yōu)秀的指揮的時候,您首先要找的是一名優(yōu)秀的音樂演奏家.但并非每個音樂演奏家都能成為優(yōu)秀的指揮.架構師的專業(yè)發(fā)展方面也與此類似.越來越多的 IT 組織開...