自動(dòng)化登錄態(tài)管理

如何在前端實(shí)現(xiàn)自動(dòng)或無(wú)感化的登錄態(tài)管理储矩,包括用戶注冊(cè)、登錄即硼、接口校驗(yàn)登錄態(tài)以及實(shí)現(xiàn)自動(dòng)化請(qǐng)求時(shí)自動(dòng)攜帶訪問(wèn)令牌屡拨。我們將探討兩種常見(jiàn)的實(shí)現(xiàn)方式:使用 HTTP Cookie 和前端存儲(chǔ)和發(fā)送訪問(wèn)令牌。

1. 注冊(cè)和登錄

首先裂允,用戶需要通過(guò)注冊(cè)和登錄來(lái)獲取訪問(wèn)令牌。

1.1 注冊(cè)接口

在注冊(cè)接口中僻澎,用戶提供必要的注冊(cè)信息(如用戶名和密碼)十饥,服務(wù)器對(duì)用戶進(jìn)行驗(yàn)證并創(chuàng)建用戶賬戶逗堵。

示例代碼(Node.js + Express):

// 注冊(cè)接口
app.post('/register', async (req, res) => {
  try {
    const { username, email, password } = req.body;

    // 檢查用戶名和郵箱是否已被注冊(cè)
    if (users.some(user => user.username === username)) {
      return res.status(400).json({ error: '用戶名已被注冊(cè)' });
    }

    if (users.some(user => user.email === email)) {
      return res.status(400).json({ error: '郵箱已被注冊(cè)' });
    }

    // 使用bcrypt對(duì)密碼進(jìn)行哈希處理
    const hashedPassword = await bcrypt.hash(password, 10);

    // 創(chuàng)建新用戶對(duì)象
    const user = {
      id: Date.now().toString(),
      username,
      email,
      password: hashedPassword
    };

    // 將用戶信息存儲(chǔ)到數(shù)據(jù)庫(kù)
    users.push(user);

    // 創(chuàng)建訪問(wèn)令牌
    const token = jwt.sign({ userId: user.id }, 'secretKey');

    res.status(201).json({ message: '注冊(cè)成功', token });
  } catch (error) {
    res.status(500).json({ error: '注冊(cè)失敗' });
  }
});

1.2 登錄接口

在登錄接口中蜒秤,用戶提供登錄憑據(jù)(如用戶名和密碼),服務(wù)器驗(yàn)證憑據(jù)的正確性并頒發(fā)訪問(wèn)令牌攘滩。

示例代碼(Node.js + Express):

app.post('/login', (req, res) => {
  // 獲取登錄憑據(jù)
  const { username, password } = req.body;

  // 在此處進(jìn)行用戶名和密碼的驗(yàn)證轰驳,如檢查用戶名是否存在弟灼、密碼是否匹配等

  // 驗(yàn)證成功,頒發(fā)訪問(wèn)令牌
  const token = createAccessToken(username);

  // 將訪問(wèn)令牌寫(xiě)入 Cookie
  res.cookie('token', token, {
    httpOnly: true,
    secure: true, // 僅在 HTTPS 連接時(shí)發(fā)送 Cookie
    sameSite: 'Strict' // 限制跨站點(diǎn)訪問(wèn)勤哗,提高安全性
  });

  // 返回登錄成功的響應(yīng)
  res.status(200).json({ message: '登錄成功' });
});

2. 接口校驗(yàn)登錄態(tài)

在需要校驗(yàn)登錄態(tài)的受保護(hù)接口中芒划,服務(wù)器將校驗(yàn)請(qǐng)求中的登錄憑據(jù)(Cookie 或訪問(wèn)令牌)的有效性欧穴。

示例代碼(Node.js + Express):

app.get('/protected', (req, res) => {
  // 從請(qǐng)求的 Cookie 中提取訪問(wèn)令牌
  const token = req.cookies.token;

  // 或從請(qǐng)求頭部中提取訪問(wèn)令牌,如果采用前端存儲(chǔ)和發(fā)送訪問(wèn)令牌方式
  // const token = req.headers.authorization.split(' ')[1]; // 示例代碼拼苍,需根據(jù)實(shí)際情況進(jìn)行解析

  // 檢查訪問(wèn)令牌的有效性
  if (!token) {
    return res.status(401).json({ error: '未提供訪問(wèn)令牌' });
  }

  try {
    // 驗(yàn)證訪問(wèn)令牌
    const decoded = verifyAccessToken(token);

    // 在此處進(jìn)行更詳細(xì)的用戶權(quán)限校驗(yàn)等操作

    // 返回受保護(hù)資源
    res.status(200).json({ message: '訪問(wèn)受保護(hù)資源成功' });
  } catch (error) {
    res.status(401).json({ error: '無(wú)效的訪問(wèn)令牌' });
  }
});

3. 自動(dòng)化登錄態(tài)管理

要實(shí)現(xiàn)自動(dòng)或無(wú)感化的登錄態(tài)管理疮鲫,前端需要在每個(gè)請(qǐng)求中自動(dòng)攜帶訪問(wèn)令牌(Cookie 或請(qǐng)求頭部)。

3.1 使用 HTTP Cookie

當(dāng)使用 HTTP Cookie 時(shí)俊犯,瀏覽器會(huì)自動(dòng)將 Cookie 包含在每個(gè)請(qǐng)求的頭部中,無(wú)需手動(dòng)設(shè)置者祖。

示例代碼(前端使用 JavaScript):

// 發(fā)送請(qǐng)求時(shí)绢彤,瀏覽器自動(dòng)攜帶 Cookie
fetch('/protected');
`````javascript
// 發(fā)送請(qǐng)求時(shí),瀏覽器自動(dòng)攜帶 Cookie
fetch('/protected');

3.2 前端存儲(chǔ)和發(fā)送訪問(wèn)令牌

當(dāng)使用前端存儲(chǔ)和發(fā)送訪問(wèn)令牌時(shí),前端需要在每個(gè)請(qǐng)求的頭部中手動(dòng)設(shè)置訪問(wèn)令牌奇适。

示例代碼(前端使用 JavaScript):

// 從存儲(chǔ)中獲取訪問(wèn)令牌
const token = localStorage.getItem('token');

// 設(shè)置請(qǐng)求頭部
const headers = {
  'Authorization': `Bearer ${token}`
};

// 發(fā)送請(qǐng)求時(shí)芦鳍,手動(dòng)設(shè)置請(qǐng)求頭部
fetch('/protected', { headers });

在上述示例代碼中,我們使用了前端的 localStorage 來(lái)存儲(chǔ)訪問(wèn)令牌皮仁,并在發(fā)送請(qǐng)求時(shí)手動(dòng)設(shè)置了請(qǐng)求頭部的 Authorization 字段菲宴。

請(qǐng)注意,無(wú)論使用哪種方式势誊,都需要在服務(wù)器端進(jìn)行訪問(wèn)令牌的驗(yàn)證和安全性檢查粟耻,以確保請(qǐng)求的合法性和保護(hù)用戶數(shù)據(jù)的安全眉踱。

補(bǔ)充說(shuō)明:

  • createUser:自定義函數(shù),用于創(chuàng)建用戶賬戶并將其保存到數(shù)據(jù)庫(kù)或其他持久化存儲(chǔ)中册烈。
  • createAccessToken:自定義函數(shù)婿禽,用于創(chuàng)建訪問(wèn)令牌矮冬。
  • verifyAccessToken:自定義函數(shù)胎署,用于驗(yàn)證訪問(wèn)令牌的有效性窑滞。

寫(xiě)在最后

文章旨在答疑掃盲,內(nèi)容簡(jiǎn)明扼要方便學(xué)習(xí)了解巨坊,請(qǐng)確保在實(shí)際應(yīng)用中采取適當(dāng)?shù)陌踩胧﹣?lái)保護(hù)用戶的登錄憑據(jù)和敏感數(shù)據(jù)趾撵,保持學(xué)習(xí)共啃,共勉~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市究珊,隨后出現(xiàn)的幾起案子剿涮,更是在濱河造成了極大的恐慌,老刑警劉巖取试,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件想括,死亡現(xiàn)場(chǎng)離奇詭異烙博,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)铺根,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)位迂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人臣缀,你說(shuō)我怎么就攤上這事泻帮。” “怎么了脂倦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵赖阻,是天一觀的道長(zhǎng)踱蠢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)苇侵,這世上最難降的妖魔是什么稼虎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任霎俩,我火速辦了婚禮打却,結(jié)果婚禮上谎倔,老公的妹妹穿的比我還像新娘。我一直安慰自己片习,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布状知。 她就那樣靜靜地躺著饥悴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓣铣。 梳的紋絲不亂的頭發(fā)上贷揽,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天擒滑,我揣著相機(jī)與錄音,去河邊找鬼藻糖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巨柒,可吹牛的內(nèi)容都是我干的柠衍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牺勾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驻民!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起回还,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柠硕,失蹤者是張志新(化名)和其女友劉穎运提,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诫咱,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坎缭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掏呼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莽鸿,死狀恐怖祥得,靈堂內(nèi)的尸體忽然破棺而出蒋得,到底是詐尸還是另有隱情,我是刑警寧澤额衙,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布窍侧,位于F島的核電站,受9級(jí)特大地震影響硼啤,放射性物質(zhì)發(fā)生泄漏斧账。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一亏镰、第九天 我趴在偏房一處隱蔽的房頂上張望拯爽。 院中可真熱鬧钧忽,春花似錦、人聲如沸耸黑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葫辐。三九已至,卻和暖如春耿战,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狈涮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工歌馍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骆姐。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓捏题,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親公荧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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