第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

JWT單點(diǎn)登錄原理學(xué)習(xí)入門

標(biāo)簽:
雜七雜八
概述

JWT单点登录原理学习入门涉及JWT的基础概念、用途以及如何利用JWT实现单点登录。文章详细解释了JWT的组成部分、生成和验证过程,并展示了JWT在实现单点登录中的应用步骤和示例代码。

JWT基础概念介绍

什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种在各方之间安全地传输信息的方法。JWT由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。这三部分通过.符号连接起来形成一个字符串。

头部 (Header)

头部主要包含两个部分:令牌的类型和加密算法。以下是示例头部的JSON对象:

{
  "typ": "JWT",
  "alg": "HS256"
}

其中typ表示令牌的类型,alg表示用于生成签名的加密算法,HS256表示HMAC-SHA256。

载荷 (Payload)

载荷部分携带了声明(Claims)的集合。声明分为三个类型:注册声明(registered claims),公共声明(public claims)和私有声明(private claims)。

注册声明包括:

  • iss:令牌签发者
  • sub:主题
  • aud:接收者
  • exp:过期时间
  • nbf:生效时间
  • iat:签发时间
  • jti:JWT ID,唯一标识该令牌

以下是载荷部分的示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

其中,sub表示用户标识,name表示用户姓名,iat表示签发时间。

签名 (Signature)

签名部分将头部和载荷进行编码后,再次进行签名。以下是一个签名的示例:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

其中,headerpayload是前面提到的JSON对象,secret是用于生成签名的一个密钥。

JWT的用途

JWT主要用于身份验证和授权,其核心用途包括:

  1. 身份验证:通过JWT,用户可以在无需服务器存储会话的情况下进行身份验证。
  2. 授权:JWT可用于携带用户权限信息,服务器端可以根据JWT中的信息判断用户是否有权访问某个资源。
  3. 单点登录(SSO):JWT可以用于多个应用之间的单点登录,用户登录一次即可访问所有相关应用。
单点登录(SSO)的基本原理

什么是单点登录

单点登录(Single Sign-On,SSO)是一种身份验证技术,允许用户使用一组身份验证数据在多个相关应用或系统中访问资源,而无需进行多次身份验证。

单点登录的好处

  1. 减少用户负担:用户只需要记住一个用户名和密码,简化了登录过程。
  2. 提高安全性:通过集中管理用户身份,减少因多个地方存储密码而带来的安全隐患。
  3. 方便管理:集中管理用户身份和访问权限,便于统一管理和审计。
JWT与单点登录的关系

JWT如何实现单点登录

JWT可以利用其声明机制和无状态特性来实现单点登录。具体步骤如下:

  1. 用户登录:用户通过身份验证后,服务器生成一个JWT。
  2. 发放JWT:服务器将生成的JWT返回给用户,用户将其存储在本地(如浏览器的localStorage中)。
  3. 访问资源:用户访问其他应用时,该应用会检查用户是否已登录(即是否携带了有效的JWT)。
  4. 验证JWT:应用使用JWT的签名验证其有效性,并根据载荷中的信息决定是否授权访问。
  5. 共享会话:由于JWT是无状态的,所以多个应用可以共享同一个JWT,实现单点登录的效果。

JWT的优势

  1. 无状态性:服务器无需存储会话状态,减轻了服务器的负担。
  2. 轻量级:JWT相比于传统的Session更小,传输成本低。
  3. 跨域支持:JWT可以在不同域名和协议之间传输,支持跨域请求。
JWT单点登录的实现步骤

创建JWT

创建JWT需要生成头部和载荷,并使用密钥进行签名。以下是使用Node.js和jsonwebtoken库生成JWT的示例:

const jwt = require('jsonwebtoken');

const secret = 'your_secret_key_here';

const payload = {
  sub: '123456789',
  name: 'John Doe',
  iat: Math.floor(Date.now() / 1000)
};

const token = jwt.sign(payload, secret, { algorithm: 'HS256' });

console.log(token);

验证JWT

验证JWT需要使用相同的密钥和算法来解码并验证签名。以下是使用Node.js验证JWT的示例:

const jwt = require('jsonwebtoken');

const secret = 'your_secret_key_here';
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkiLCJuYW1lIjoibG9uZSIsImlhdCI6MTUxNjIzOTAyMn0.NjW0o0K5Xe4O0Z6Ojw9iCtA5s6PA34R5j8jG006mLqQ';

try {
  const decoded = jwt.verify(token, secret);
  console.log(decoded);
} catch (err) {
  console.error('Invalid token');
}

使用JWT进行身份验证

在实际应用中,可以使用中间件来验证JWT。以下是一个Express.js示例:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const secret = 'your_secret_key_here';

app.use(express.json());

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  // 假设这里验证了用户名和密码
  const user = { id: 1, name: 'John Doe' };
  const token = jwt.sign({ sub: user.id, name: user.name }, secret, { algorithm: 'HS256' });

  res.json({ token });
});

app.get('/protected', (req, res, next) => {
  const token = req.headers['authorization']?.split(' ')[1];
  try {
    const decoded = jwt.verify(token, secret);
    req.user = decoded;
    next();
  } catch (err) {
    next({ status: 401, message: 'Not authenticated' });
  }
}, (req, res) => {
  res.json({ message: 'Hello, ' + req.user.name });
});

app.listen(3000, () => console.log('Server running on port 3000'));
实际应用示例

模拟场景:用户登录与注销

此场景包含用户登录和注销功能,使用JWT进行身份验证。

用户登录

用户登录后,服务器生成JWT并返回给客户端:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const secret = 'your_secret_key_here';

app.use(express.json());

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  // 假设这里验证了用户名和密码
  const user = { id: 1, name: 'John Doe' };
  const token = jwt.sign({ sub: user.id, name: user.name }, secret, { algorithm: 'HS256' });

  res.json({ token });
});

用户注销

用户注销时,客户端可以删除存储的JWT,服务器端无需特别处理:

app.post('/logout', (req, res) => {
  // 实际应用中可能需要删除服务器端的会话数据
  // 这里只需通知客户端清除JWT
  res.json({ message: 'Logged out' });
});

演示JWT在不同应用间的流转

这里演示用户在不同应用间共享JWT的流程:

  1. 应用A登录:用户在应用A中登录,服务器返回JWT。
  2. 应用A跳转到应用B:应用A将JWT传递给应用B。
  3. 应用B验证JWT:应用B验证JWT的有效性,并根据载荷中的信息决定是否授权访问。
app.get('/protected', (req, res, next) => {
  const token = req.headers['authorization']?.split(' ')[1];
  try {
    const decoded = jwt.verify(token, secret);
    req.user = decoded;
    next();
  } catch (err) {
    next({ status: 401, message: 'Not authenticated' });
  }
}, (req, res) => {
  res.json({ message: 'Hello, ' + req.user.name });
});
常见问题与解决方案

JWT安全性问题

JWT安全性问题主要涉及密钥管理、令牌泄露和篡改等。以下是一些常见的解决方案:

  1. 密钥管理:确保密钥的安全存储和定期更换,避免泄露。
  2. 令牌泄露:建议使用HTTPS协议传输JWT,减少中间人攻击的风险。
  3. 令牌篡改:使用有效的加密算法和密钥对JWT进行签名,防止篡改。

令牌刷新

当收到过期的JWT时,客户端可以请求服务器生成新的JWT:

app.post('/refresh', (req, res) => {
  const refreshToken = req.body.refreshToken;
  try {
    const decoded = jwt.verify(refreshToken, 'refresh_secret_key');
    const token = jwt.sign({ sub: decoded.sub, name: decoded.name }, secret, { algorithm: 'HS256' });
    res.json({ token });
  } catch (err) {
    res.status(401).json({ message: 'Invalid refresh token' });
  }
});

令牌泄露防护

使用HTTPS确保JWT传输的安全:

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  // 假设这里验证了用户名和密码
  const user = { id: 1, name: 'John Doe' };
  const token = jwt.sign({ sub: user.id, name: user.name }, secret, { algorithm: 'HS256' });

  res.json({ token });
});

令牌篡改检测

通过验证签名确保JWT未被篡改:

app.get('/protected', (req, res, next) => {
  const token = req.headers['authorization']?.split(' ')[1];
  try {
    const decoded = jwt.verify(token, secret);
    req.user = decoded;
    next();
  } catch (err) {
    next({ status: 401, message: 'Not authenticated' });
  }
}, (req, res) => {
  res.json({ message: 'Hello, ' + req.user.name });
});

以上是JWT单点登录的完整实现和应用示例。通过JWT,可以实现轻量级、无状态的身份验证和授权机制,适用于单点登录等场景。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消