前后端分類 登錄驗(yàn)證

今天修改項(xiàng)目的登陸認(rèn)證問(wèn)題赴精,之前用的shiro+freemarker雇初。后來(lái)項(xiàng)目改成了前后端分離戏罢,全部使用json進(jìn)行前后臺(tái)數(shù)據(jù)交互硝清,于是想做一個(gè)登錄認(rèn)證的功能辅斟,網(wǎng)上找了下資料,這里做下總結(jié)芦拿。

1. 使用token

  1. 前端把a(bǔ)ccount和password士飒,提交到服務(wù)端的登錄api查邢;
  2. 服務(wù)端驗(yàn)證正確后,生成一個(gè)token酵幕,并把token和userId扰藕,存在緩存里(推薦redis數(shù)據(jù)庫(kù)),然后把token返回給前端芳撒;
  3. 前端每次的請(qǐng)求頭中帶token邓深。

這里要引入下JWT。

1.1 JWT基本概念

Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計(jì)為緊湊且安全的笔刹,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場(chǎng)景芥备。JWT的聲明一般被用來(lái)在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源徘熔,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息门躯,該token也可直接被用于認(rèn)證,也可被加密酷师。

1.1.1 組成部分

由三部分構(gòu)成:

header.payload.signature

header(頭部)

{
  "typ": "JWT", // 聲明這是JWT
  "alg": "HS256" // 聲明簽名的加密方式
}

將這部分信息進(jìn)行BASE64編碼后讶凉,就是jwt.頭部

payload(載荷)

  • 標(biāo)準(zhǔn)中注冊(cè)的聲明
  • 公共的聲明
  • 私有的聲明
  1. ?
{
    "iss": "John Wu JWT",
    "iat": 1441593502,
    "exp": 1441594722,
    "aud": "www.example.com",
    "sub": "jrocket@example.com",
    "from_user": "B",
    "target_user": "A"
}
  • iss: jwt簽發(fā)者
  • sub: jwt所面向的用戶
  • aud: 接收jwt的一方
  • exp: jwt的過(guò)期時(shí)間,這個(gè)過(guò)期時(shí)間必須要大于簽發(fā)時(shí)間
  • nbf: 定義在什么時(shí)間之前山孔,該jwt都是不可用的.
  • iat: jwt的簽發(fā)時(shí)間
  • jti: jwt的唯一身份標(biāo)識(shí)懂讯,主要用來(lái)作為一次性token,從而回避重放攻擊。
  1. 公共的聲明
    公共的聲明可以添加任何的信息台颠,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.但不建議添加敏感信息褐望,因?yàn)樵摬糠衷诳蛻舳丝山饷?

  2. 私有的聲明
    私有聲明是提供者和消費(fèi)者所共同定義的聲明,一般不建議存放敏感信息串前,因?yàn)閎ase64是對(duì)稱解密的瘫里,意味著該部分信息可以歸類為明文信息。

自定義一個(gè)payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

將其進(jìn)行BASE64編碼后就是JWT的載荷部分

signature(簽名)

簽名是header.payload加鹽secretSHA256加密后生成的編碼荡碾,即頭部的BASE64編碼和載荷的BASE64編碼由句號(hào).相連后谨读,加上服務(wù)器的密鑰,再由頭部中定義的算法(一般是SHA256)加密生成的編碼

1.2 驗(yàn)證過(guò)程

客戶端向服務(wù)器發(fā)起請(qǐng)求后坛吁,服務(wù)端驗(yàn)證通過(guò)后生成jwt字符串返回給客戶端劳殖,客戶端在每次請(qǐng)求的時(shí)候在頭部加上Authorization,服務(wù)器接收請(qǐng)求后獲取拨脉,解析頭部的JWT字符串哆姻,會(huì)根據(jù)頭部和載荷中的字符串,加上服務(wù)器本地儲(chǔ)存的密鑰進(jìn)行SHA256加密計(jì)算玫膀,計(jì)算出的字符串如果跟請(qǐng)求中的JWT的簽名一致矛缨,則認(rèn)為認(rèn)證通過(guò)。
如果頭部和載荷中的任一字符改動(dòng),都會(huì)驗(yàn)證失敗劳景。

2. 使用cookie

  1. client發(fā)送username和password到server誉简;
  2. server驗(yàn)證成功后, 寫cookie到client盟广,然后返回ok的json,其中cookie的key要存儲(chǔ)在redis中瓮钥,value就是用戶信息筋量,并且要設(shè)置key的超時(shí)時(shí)間,如:60分鐘碉熄;
  3. client收到ok后桨武,進(jìn)行相應(yīng)的業(yè)務(wù)操作,以后每次請(qǐng)求server都會(huì)自動(dòng)帶上cookie锈津;
  4. server端的filter(用filter來(lái)實(shí)現(xiàn))中會(huì)每次驗(yàn)證傳過(guò)來(lái)的cookie的key在redis中是否存在呀酸, 有就代表登錄成功過(guò)可以操作,沒(méi)有就返回錯(cuò)誤標(biāo)識(shí)琼梆。注意: 在登錄成功后性誉,每次調(diào)用服務(wù)器接口時(shí)候, 都要為redis的key進(jìn)行續(xù)期茎杂,如60分鐘错览;
  5. 當(dāng)redis的key超過(guò)60分鐘,自己會(huì)刪除這個(gè)key煌往,那么再次請(qǐng)求server時(shí)倾哺,就會(huì)收到需要登錄的返回值;
  6. 當(dāng)用戶主動(dòng)退出系統(tǒng)的時(shí)候刽脖,也要在server中刪除redis的key羞海。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曲管,隨后出現(xiàn)的幾起案子却邓,更是在濱河造成了極大的恐慌,老刑警劉巖翘地,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件申尤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衙耕,警方通過(guò)查閱死者的電腦和手機(jī)昧穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)橙喘,“玉大人时鸵,你說(shuō)我怎么就攤上這事。” “怎么了饰潜?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵初坠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我彭雾,道長(zhǎng)碟刺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任薯酝,我火速辦了婚禮半沽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吴菠。我一直安慰自己者填,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布做葵。 她就那樣靜靜地躺著占哟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酿矢。 梳的紋絲不亂的頭發(fā)上榨乎,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音棠涮,去河邊找鬼谬哀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛严肪,可吹牛的內(nèi)容都是我干的史煎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驳糯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篇梭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酝枢,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恬偷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帘睦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袍患,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年竣付,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诡延。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古胆,死狀恐怖肆良,靈堂內(nèi)的尸體忽然破棺而出筛璧,到底是詐尸還是另有隱情,我是刑警寧澤惹恃,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布夭谤,位于F島的核電站,受9級(jí)特大地震影響巫糙,放射性物質(zhì)發(fā)生泄漏朗儒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一参淹、第九天 我趴在偏房一處隱蔽的房頂上張望采蚀。 院中可真熱鬧,春花似錦承二、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至识啦,卻和暖如春负蚊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颓哮。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工家妆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冕茅。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓伤极,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親姨伤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哨坪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容