oauth2.0

article/2025/6/5 11:49:42

OAuth 2.0 的工作原理和流程。

OAuth 2.0 是一个授权框架,它允许第三方应用获取对用户资源的有限访问权限,而无需获取用户的密码。以下是详细说明:

1. OAuth 2.0 的四个主要角色

  1. 资源所有者(Resource Owner)
    • 通常是用户
    • 拥有被访问资源的实体
  2. 客户端(Client)
    • 请求访问资源的应用
    • 例如:第三方网站、移动应用等
  3. 授权服务器(Authorization Server)
    • 验证用户身份
    • 颁发访问令牌(Access Token)
  4. 资源服务器(Resource Server)
    • 托管受保护资源的服务器
    • 接受并验证访问令牌

2. OAuth 2.0 的四种授权模式

2.1 授权码模式(Authorization Code)

最完整、最安全的流程,适用于有后端的应用:

  1. 用户访问客户端应用
  2. 客户端将用户重定向到授权服务器
  3. 用户在授权服务器上登录并授权
  4. 授权服务器将用户重定向回客户端,并带上授权码
  5. 客户端使用授权码向授权服务器请求访问令牌
  6. 授权服务器验证授权码,颁发访问令牌
  7. 客户端使用访问令牌访问资源服务器
2.2 简化模式(Implicit)

适用于纯前端应用:

  1. 用户访问客户端应用
  2. 客户端将用户重定向到授权服务器
  3. 用户在授权服务器上登录并授权
  4. 授权服务器将用户重定向回客户端,并直接在URL中返回访问令牌
  5. 客户端使用访问令牌访问资源服务器
2.3 密码模式(Resource Owner Password Credentials)

适用于高度信任的应用:

  1. 用户向客户端提供用户名和密码
  2. 客户端使用这些凭据向授权服务器请求访问令牌
  3. 授权服务器验证凭据,颁发访问令牌
  4. 客户端使用访问令牌访问资源服务器
2.4 客户端模式(Client Credentials)

适用于服务器间通信:

  1. 客户端向授权服务器请求访问令牌
  2. 授权服务器验证客户端身份,颁发访问令牌
  3. 客户端使用访问令牌访问资源服务器

3. 令牌类型

  1. 访问令牌(Access Token)
    • 用于访问资源的令牌
    • 有效期较短
    • 包含访问权限信息
  2. 刷新令牌(Refresh Token)
    • 用于获取新的访问令牌
    • 有效期较长
    • 可以撤销

4. 安全考虑

  1. 使用 HTTPS
    • 所有通信都应该通过 HTTPS 进行
    • 防止令牌被窃取
  2. 令牌存储
    • 访问令牌应该安全存储
    • 不要存储在 localStorage 中
    • 最好使用 HttpOnly cookie
  3. 令牌有效期
    • 访问令牌应该设置合理的有效期
    • 使用刷新令牌机制
  4. 范围限制
    • 使用 scope 参数限制访问权限
    • 遵循最小权限原则

5. 实际应用示例

以 GitHub OAuth 为例:

// 1. 配置 OAuth 应用
const config = {client_id: 'your_client_id',client_secret: 'your_client_secret',redirect_uri: 'http://localhost:3000/callback',scope: 'user:email'
};// 2. 构建授权 URL
const authUrl = `https://github.com/login/oauth/authorize?client_id=${config.client_id}&redirect_uri=${config.redirect_uri}&scope=${config.scope}`;// 3. 处理回调
async function handleCallback(code) {// 4. 使用授权码获取访问令牌const tokenResponse = await fetch('https://github.com/login/oauth/access_token', {method: 'POST',headers: {'Content-Type': 'application/json','Accept': 'application/json'},body: JSON.stringify({client_id: config.client_id,client_secret: config.client_secret,code: code})});const { access_token } = await tokenResponse.json();// 5. 使用访问令牌访问 APIconst userResponse = await fetch('https://api.github.com/user', {headers: {'Authorization': `Bearer ${access_token}`}});return await userResponse.json();
}

6. 最佳实践

  1. 使用 PKCE(Proof Key for Code Exchange)
    • 增加授权码模式的安全性
    • 防止授权码被截获
  2. 实现令牌轮换
    • 定期刷新访问令牌
    • 使用刷新令牌获取新的访问令牌
  3. 错误处理
    • 处理令牌过期
    • 处理授权失败
    • 实现优雅的降级策略
  4. 监控和日志
    • 记录授权请求
    • 监控异常访问
    • 实现审计日志
  5. 用户界面
    • 清晰的授权提示
    • 显示授权范围
    • 提供撤销授权的选项

OAuth 2.0 是一个强大的授权框架,正确实现它可以提供安全、可靠的用户授权机制。根据你的具体需求,选择合适的授权模式,并遵循安全最佳实践。

四个主要角色

我来用具体的例子说明 OAuth 2.0 中的四个角色。我们以"使用微信登录第三方网站"为例:

1. 资源所有者(Resource Owner)

具体例子:用户张三

  • 张三拥有自己的微信账号
  • 张三的微信账号中包含:
    • 个人基本信息(头像、昵称)
    • 好友列表
    • 朋友圈内容
    • 其他个人数据

2. 客户端(Client)

具体例子:第三方网站"美食点评网"

  • 美食点评网想要获取用户的基本信息
  • 需要实现的功能:
    • 使用微信账号登录
    • 获取用户头像和昵称
    • 可能还需要获取用户的好友列表(用于社交功能)

3. 授权服务器(Authorization Server)

具体例子:微信的授权服务器

  • 负责处理授权请求
  • 具体功能:
    • 显示微信登录页面
    • 验证用户身份
    • 让用户确认授权范围
    • 生成访问令牌
    • 管理令牌的刷新和撤销

4. 资源服务器(Resource Server)

具体例子:微信的 API 服务器

  • 存储和管理用户数据
  • 提供 API 接口:
    • 获取用户信息接口
    • 获取好友列表接口
    • 获取朋友圈内容接口

完整流程示例

让我们通过一个具体的场景来说明这四个角色如何交互:

  1. 初始状态
    • 张三(资源所有者)访问美食点评网(客户端)
    • 美食点评网提供"微信登录"选项
  2. 授权请求
美食点评网 -> 微信授权服务器:
"请让用户授权我们访问其基本信息"
  1. 用户授权
    • 微信授权服务器显示授权页面
    • 张三看到授权请求:
      • 允许美食点评网获取:头像、昵称
      • 不允许获取:好友列表、朋友圈内容
    • 张三点击"允许"
  2. 令牌颁发
微信授权服务器 -> 美食点评网:
"这是访问令牌,有效期2小时"
  1. 资源访问
美食点评网 -> 微信资源服务器:
"请提供用户张三的头像和昵称"
(附上访问令牌)
  1. 资源返回
微信资源服务器 -> 美食点评网:
"这是张三的头像和昵称"

另一个例子:GitHub 登录

让我们再看一个 GitHub 登录的例子:

  1. 资源所有者
    • 用户李四
    • 拥有 GitHub 账号
    • 包含代码仓库、个人信息等
  2. 客户端
    • 代码托管平台 GitLab
    • 想要实现 GitHub 账号登录
    • 需要获取用户基本信息
  3. 授权服务器
    • GitHub 的授权服务器
    • 处理 OAuth 授权请求
    • 管理访问令牌
  4. 资源服务器
    • GitHub 的 API 服务器
    • 提供用户信息 API
    • 提供仓库信息 API

实际代码示例

// 客户端(美食点评网)的代码示例
class OAuthClient {constructor() {this.clientId = 'your_client_id';this.clientSecret = 'your_client_secret';this.redirectUri = 'https://food-review.com/callback';}// 1. 构建授权URLgetAuthorizationUrl() {return `https://wechat.com/oauth/authorize?client_id=${this.clientId}&redirect_uri=${this.redirectUri}&scope=userinfo&response_type=code`;}// 2. 处理授权回调async handleCallback(code) {// 使用授权码获取访问令牌const tokenResponse = await fetch('https://wechat.com/oauth/token', {method: 'POST',body: JSON.stringify({client_id: this.clientId,client_secret: this.clientSecret,code: code})});const { access_token } = await tokenResponse.json();// 3. 使用访问令牌获取用户信息const userResponse = await fetch('https://api.wechat.com/userinfo', {headers: {'Authorization': `Bearer ${access_token}`}});return await userResponse.json();}
}// 使用示例
const client = new OAuthClient();// 当用户点击"微信登录"按钮时
function handleWechatLogin() {// 重定向到微信授权页面window.location.href = client.getAuthorizationUrl();
}// 在回调页面处理授权结果
async function handleCallback() {const code = new URLSearchParams(window.location.search).get('code');if (code) {const userInfo = await client.handleCallback(code);// 使用获取到的用户信息进行登录loginUser(userInfo);}
}

这个例子展示了:

  1. 客户端如何发起授权请求
  2. 如何处理授权回调
  3. 如何使用访问令牌获取资源
  4. 四个角色之间如何交互

通过这样的具体例子,我们可以更好地理解 OAuth 2.0 中各个角色的职责和它们之间的交互关系。

四种授权模式

我来详细说明 OAuth 2.0 的四种授权模式,每种模式都会用具体的例子和代码来说明。

1. 授权码模式(Authorization Code)

最完整、最安全的流程,适用于有后端的应用。

流程说明:
  1. 用户访问客户端应用
  2. 客户端将用户重定向到授权服务器
  3. 用户在授权服务器上登录并授权
  4. 授权服务器将用户重定向回客户端,并带上授权码
  5. 客户端使用授权码向授权服务器请求访问令牌
  6. 授权服务器验证授权码,颁发访问令牌
  7. 客户端使用访问令牌访问资源服务器
具体例子:使用 GitHub 登录第三方网站
// 客户端代码
class GitHubOAuth {constructor() {this.clientId = 'your_client_id';this.clientSecret = 'your_client_secret';this.redirectUri = 'http://localhost:3000/callback';}// 1. 构建授权URLgetAuthorizationUrl() {return `https://github.com/login/oauth/authorize?client_id=${this.clientId}&redirect_uri=${this.redirectUri}&scope=user:email&state=${this.generateState()}`;}// 2. 处理回调,获取访问令牌async handleCallback(code) {const tokenResponse = await fetch('https://github.com/login/oauth/access_token', {method: 'POST',headers: {'Content-Type': 'application/json','Accept': 'application/json'},body: JSON.stringify({client_id: this.clientId,client_secret: this.clientSecret,code: code})});const { access_token } = await tokenResponse.json();return access_token;}// 3. 使用访问令牌获取用户信息async getUserInfo(accessToken) {const response = await fetch('https://api.github.com/user', {headers: {'Authorization': `Bearer ${accessToken}`}});return await response.json();}
}

2. 简化模式(Implicit)

适用于纯前端应用,没有后端服务器。

流程说明:
  1. 用户访问客户端应用
  2. 客户端将用户重定向到授权服务器
  3. 用户在授权服务器上登录并授权
  4. 授权服务器将用户重定向回客户端,并直接在URL中返回访问令牌
  5. 客户端使用访问令牌访问资源服务器
具体例子:单页应用使用 Google 登录
// 客户端代码
class GoogleOAuth {constructor() {this.clientId = 'your_client_id';this.redirectUri = 'http://localhost:3000/callback';}// 1. 构建授权URLgetAuthorizationUrl() {return `https://accounts.google.com/o/oauth2/v2/auth?client_id=${this.clientId}&redirect_uri=${this.redirectUri}&response_type=token&scope=email profile`;}// 2. 处理回调,从URL中获取访问令牌handleCallback() {const hash = window.location.hash.substring(1);const params = new URLSearchParams(hash);return params.get('access_token');}// 3. 使用访问令牌获取用户信息async getUserInfo(accessToken) {const response = await fetch('https://www.googleapis.com/oauth2/v2/userinfo', {headers: {'Authorization': `Bearer ${accessToken}`}});return await response.json();}
}

3. 密码模式(Resource Owner Password Credentials)

适用于高度信任的应用,如内部系统。

流程说明:
  1. 用户向客户端提供用户名和密码
  2. 客户端使用这些凭据向授权服务器请求访问令牌
  3. 授权服务器验证凭据,颁发访问令牌
  4. 客户端使用访问令牌访问资源服务器
具体例子:企业内部系统
// 客户端代码
class InternalOAuth {constructor() {this.clientId = 'your_client_id';this.clientSecret = 'your_client_secret';}// 1. 使用用户名密码获取访问令牌async getAccessToken(username, password) {const response = await fetch('https://api.internal.com/oauth/token', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({grant_type: 'password',client_id: this.clientId,client_secret: this.clientSecret,username: username,password: password})});const { access_token } = await response.json();return access_token;}// 2. 使用访问令牌访问资源async getResource(accessToken) {const response = await fetch('https://api.internal.com/resource', {headers: {'Authorization': `Bearer ${accessToken}`}});return await response.json();}
}

4. 客户端模式(Client Credentials)

适用于服务器间通信。

流程说明:
  1. 客户端向授权服务器请求访问令牌
  2. 授权服务器验证客户端身份,颁发访问令牌
  3. 客户端使用访问令牌访问资源服务器
具体例子:微服务间通信
// 客户端代码
class ServiceOAuth {constructor() {this.clientId = 'your_client_id';this.clientSecret = 'your_client_secret';}// 1. 获取访问令牌async getAccessToken() {const response = await fetch('https://api.service.com/oauth/token', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({grant_type: 'client_credentials',client_id: this.clientId,client_secret: this.clientSecret})});const { access_token } = await response.json();return access_token;}// 2. 使用访问令牌访问其他服务async callOtherService(accessToken) {const response = await fetch('https://api.other-service.com/data', {headers: {'Authorization': `Bearer ${accessToken}`}});return await response.json();}
}

各模式的使用场景对比

  1. 授权码模式
    • 适用场景:有后端的 Web 应用
    • 优点:最安全,支持刷新令牌
    • 缺点:流程较复杂
  2. 简化模式
    • 适用场景:单页应用(SPA)
    • 优点:实现简单,无需后端
    • 缺点:安全性较低,不支持刷新令牌
  3. 密码模式
    • 适用场景:内部系统,高度信任的应用
    • 优点:实现简单,用户体验好
    • 缺点:需要用户提供密码,安全性较低
  4. 客户端模式
    • 适用场景:服务器间通信
    • 优点:实现简单,适合自动化
    • 缺点:不涉及用户授权

安全建议

  1. 始终使用 HTTPS
// 确保所有请求都使用 HTTPS
const apiUrl = 'https://api.example.com';
  1. 实现 PKCE(授权码模式)
// 生成 code verifier
const codeVerifier = generateRandomString(128);
// 生成 code challenge
const codeChallenge = await generateCodeChallenge(codeVerifier);
  1. 使用 state 参数防止 CSRF
// 生成 state
const state = generateRandomString(32);
// 在授权请求中包含 state
const authUrl = `${authEndpoint}?state=${state}`;
  1. 实现令牌轮换
// 检查令牌是否过期
if (isTokenExpired(accessToken)) {// 使用刷新令牌获取新的访问令牌accessToken = await refreshAccessToken(refreshToken);
}
  1. 错误处理
try {const response = await fetch(resourceUrl, {headers: {'Authorization': `Bearer ${accessToken}`}});if (response.status === 401) {// 令牌过期,需要重新授权await handleTokenExpired();}
} catch (error) {// 处理其他错误console.error('Error:', error);
}

这些模式各有特点,选择哪种模式取决于你的具体需求和安全要求。授权码模式是最安全的选择,而其他模式则适用于特定的场景。

sso和oauth的关系

sso是个概念,oauth是种方法。oauth可以实现sso,sso可以由多种规范的方法实现,包括saml,oauth,kerberos,radius

是的,这句话是正确的。让我详细解释一下:

1. SSO(Single Sign-On)是一个概念

SSO 是一种身份验证机制,允许用户使用一组凭据(如用户名和密码)访问多个相关但独立的系统。

SSO 的主要特点:
  • 用户只需登录一次
  • 可以访问多个系统
  • 提高用户体验
  • 减少密码管理负担

2. OAuth 是一种实现方法

OAuth 是一个授权框架,可以用来实现 SSO。

OAuth 实现 SSO 的示例:
// 使用 OAuth 实现 SSO 的示例
class OAuthSSO {constructor() {this.config = {clientId: 'your_client_id',redirectUri: 'http://localhost:3000/callback',authority: 'https://login.example.com'};}// 登录async login() {// 重定向到身份提供者window.location.href = `${this.config.authority}/oauth/authorize?client_id=${this.config.clientId}&redirect_uri=${this.config.redirectUri}&response_type=code`;}// 处理回调async handleCallback(code) {// 获取访问令牌const token = await this.getAccessToken(code);// 获取用户信息const userInfo = await this.getUserInfo(token);return userInfo;}
}

3. 其他实现 SSO 的方法

3.1 SAML(Security Assertion Markup Language)
<!-- SAML 断言示例 -->
<saml:Assertion><saml:Subject><saml:NameID>user@example.com</saml:NameID></saml:Subject><saml:Conditions><saml:NotBefore>2024-01-01T00:00:00Z</saml:NotBefore><saml:NotOnOrAfter>2024-01-01T01:00:00Z</saml:NotOnOrAfter></saml:Conditions>
</saml:Assertion>
3.2 Kerberos
// Kerberos 认证流程
class KerberosAuth {async authenticate(username, password) {// 1. 获取 TGT(Ticket Granting Ticket)const tgt = await this.getTGT(username, password);// 2. 使用 TGT 获取服务票据const serviceTicket = await this.getServiceTicket(tgt);// 3. 使用服务票据访问服务return this.accessService(serviceTicket);}
}
3.3 RADIUS
// RADIUS 认证示例
class RadiusAuth {async authenticate(username, password) {const radiusPacket = {code: 'Access-Request',identifier: 1,attributes: [{ type: 'User-Name', value: username },{ type: 'User-Password', value: password }]};// 发送 RADIUS 请求const response = await this.sendRadiusRequest(radiusPacket);return response.code === 'Access-Accept';}
}

4. 各种方法的比较

  1. OAuth 2.0
    • 优点:
      • 广泛支持
      • 适合 Web 和移动应用
      • 支持第三方授权
    • 缺点:
      • 主要关注授权而非认证
      • 需要额外的身份验证机制
  2. SAML
    • 优点:
      • 企业级安全
      • 支持复杂的身份信息
      • 成熟的协议
    • 缺点:
      • 配置复杂
      • 主要面向企业应用
  3. Kerberos
    • 优点:
      • 高度安全
      • 适合内部网络
      • 支持双向认证
    • 缺点:
      • 配置复杂
      • 主要面向内部系统
  4. RADIUS
    • 优点:
      • 简单易用
      • 适合网络设备认证
      • 广泛支持
    • 缺点:
      • 功能相对简单
      • 主要面向网络认证

5. 选择建议

  1. Web 应用
    • 推荐使用 OAuth 2.0
    • 适合第三方集成
    • 用户体验好
  2. 企业应用
    • 推荐使用 SAML
    • 安全性高
    • 支持复杂的身份信息
  3. 内部系统
    • 推荐使用 Kerberos
    • 适合 Windows 域环境
    • 安全性高
  4. 网络设备
    • 推荐使用 RADIUS
    • 简单易用
    • 广泛支持

总结:

  1. SSO 是一个概念,表示单点登录
  2. OAuth 是实现 SSO 的一种方法
  3. 还有其他方法可以实现 SSO:
    • SAML
    • Kerberos
    • RADIUS
  4. 选择哪种方法取决于具体需求:
    • 应用类型
    • 安全要求
    • 集成需求
    • 用户体验要求

http://www.hkcw.cn/article/qInWGHwbRK.shtml

相关文章

笔记本/台式C盘扩容:删除、压缩、跨分区与重分配—「小白教程」

删除C盘右侧分区以扩展 删除分区&#xff0c;也会删除分区中所有资料&#xff0c;请注意备份所有重要资料。 1.WinX选择磁盘管理&#xff0c;右键点击C盘右侧分区&#xff0c;选择删除卷&#xff0c;原分区会变成黑色的“未分配”空间&#xff1b; 2.此时右键C盘选择“扩展卷…

【Bluedroid】蓝牙启动之sdp_init 源码解析

本文围绕Android蓝牙协议栈中 SDP&#xff08;Service Discovery Protocol&#xff0c;服务发现协议&#xff09;模块的初始化函数sdp_init展开&#xff0c;结合核心控制块tSDP_CB及关联数据结构&#xff08;如tL2CAP_CFG_INFO、tCONN_CB等&#xff09;的定义与协作逻辑&#x…

C++学习-入门到精通【13】标准库的容器和迭代器

C学习-入门到精通【13】标准库的容器和迭代器 目录 C学习-入门到精通【13】标准库的容器和迭代器一、标准模板库简介1.容器简介2.STL容器总览3.近容器4.STL容器的通用函数5.首类容器的通用typedef6.对容器元素的要求 二、迭代器简介1.使用istream_iterator输入&#xff0c;使用…

UE5 2D角色PaperZD插件动画状态机学习笔记

UE5 2D角色PaperZD插件动画状态机学习笔记 0.安装PaperZD插件 这是插件下载安装地址 https://www.fab.com/zh-cn/listings/6664e3b5-e376-47aa-a0dd-f7bbbd5b93c0 1.右键创建PaperZD 动画序列 2.添加动画序列 3&#xff0c;右键创建PaperZD AnimBP &#xff08;动画蓝图&am…

你的台式机PCIe插槽到底是几条lane

目录 1.如何查看台式机支持的PCIe插槽的模式 2.查看台式机主板型号 3.主板PCIe插槽配置确认 4.实际模式与理论模式不匹配原因 5.解决方案 在【PCIe XDMA开发】XDMA与MIG位宽一致性要求一文中&#xff0c;我们讨论了PCIe带宽计算过程。那么实际带宽与理论计算带宽是否能够一致或…

微软PowerBI考试 PL300-Power BI 入门

Power BI 入门 上篇更新了微软PowerBI考试 PL-300学习指南&#xff0c;今天分享PowerBI入门学习内容。 简介 Microsoft Power BI 是一个完整的报表解决方案&#xff0c;通过开发工具和联机平台提供数据准备、数据可视化、分发和管理。 Power BI 可以从使用单个数据源的简单…

【论文阅读】Dolphin: Document Image Parsing via Heterogeneous Anchor Prompting

Paper&#xff1a;https://arxiv.org/abs/2505.14059 Source code: https://github.com/bytedance/Dolphin 作者机构&#xff1a;字节跳动 背景 业务场景 企业数据大多数都以文本、图片、扫描件、电子表格、在线文档、邮件等文档的形式存在&#xff0c;例如&#xff1a;PDF文…

WPS 利用 宏 脚本拆分 Excel 多行文本到多行

文章目录 WPS 利用 宏 脚本拆分 Excel 多行文本到多行效果需求背景&#x1f6e0; 操作步骤代码实现代码详解使用场景注意事项总结 WPS 利用 宏 脚本拆分 Excel 多行文本到多行 在 Excel 工作表中&#xff0c;我们经常遇到一列中包含多行文本&#xff08;用换行符分隔&#xff…

STM32外部中断(EXTI)以及旋转编码器的简介

一、外部中断机制概述 中断是指当主程序执行期间出现特定触发条件&#xff08;即中断源&#xff09;时&#xff0c;CPU将暂停当前任务&#xff0c;转而执行相应的中断服务程序&#xff08;ISR&#xff09;&#xff0c;待处理完成后恢复原程序的运行流程。该机制通过事件驱动…

【Unity开发】控制手机移动端的震动

&#x1f43e; 个人主页 &#x1f43e; 阿松爱睡觉&#xff0c;横竖醒不来 &#x1f3c5;你可以不屠龙&#xff0c;但不能不磨剑&#x1f5e1; 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…

ES101系列07 | 分布式系统和分页

本篇文章主要讲解 ElasticSearch 中分布式系统的概念&#xff0c;包括节点、分片和并发控制等&#xff0c;同时还会提到分页遍历和深度遍历问题的解决方案。 节点 节点是一个 ElasticSearch 示例 其本质就是一个 Java 进程一个机器上可以运行多个示例但生产环境推荐只运行一个…

RabbitMQ在SpringBoot中的应用

1.简单模式 P:生产者,要发送消息的程序. C:消费者,消息的接收者. Queue:消息队列,类似于一个邮箱,生产者向其中投递消息,消费者从其中取出消息. 特点:一个生产者P,一个消费者C,消息只能被消费一次,也成为点对点模式. 适用场景:消息只能被单个消费者处理. 设置队列的名称为…

基于python写的目录/文件递归检索工具

核心功能 1. 目录结构检索 递归扫描 &#xff1a;深度遍历指定目录及其所有子目录 多种检索模式 &#xff1a; 仅文件夹模式&#xff1a;只显示目录结构仅文件模式&#xff1a;只显示文件列表文件文件夹模式&#xff1a;完整显示目录树结构&#xff08;默认模式&#xff09; …

Qwen3高效微调

高效微调 场景、模型、数据、算力 高效微调的应用场景 对话风格微调&#xff1a;高效微调可以用于根据特定需求调整模型的对话风格。例如&#xff0c;针对客服系统、虚拟助理等场景&#xff0c;模型可以通过微调来适应不同的 语气、礼貌程度 或 回答方式&#xff0c;从而在与…

不动产登记区块链系统(Vue3 + Go + Gin + Hyperledger Fabric)

好久没有介绍过新项目的制作了&#xff0c;之前做的一直都是Fisco Bcos的项目&#xff0c;没有介绍过Hyperledger Fabric的项目&#xff0c;这次来给大家分享下。 系统概述 不动产登记与交易平台是一个基于Hyperledger Fabric的综合性管理系统&#xff0c;旨在实现不动产登记…

深度学习学习率调度器指南:PyTorch 四大 scheduler 对决

在深度学习模型训练中&#xff0c;学习率调度器&#xff08;Learning Rate Scheduler&#xff09;是影响模型收敛效果和训练稳定性的关键因素。选择合适的学习率调度策略&#xff0c;往往能让模型性能产生质的飞跃。本文将深入对比PyTorch中最常用的四种学习率调度器&#xff0…

ERP学习-AP

业务需要。持续更新学习进度 借助网上零搭建平台上手实操 这个是简道云平台页面链接&#xff0c;登录的化去手机号登录 目前开始对应付模块进行学习

基于 ZYNQ UltraScale+ OV5640的高速图像传输系统设计,支持国产替代

引 言 随着电子信息技术的不断进步&#xff0c;人工智能、医 疗器械、机器视觉等领域都在高速发展 [1] &#xff0c;工业相机 是机器视觉系统中的一部分 [2] &#xff0c;对工业相机而言&#xff0c;传 输图像的速率、传输过程的抗干扰能力是其关键&#xff0c; 工业相…

smartGit 试用突破30天

1 下载 选择19.1版本 2 运行 我是linux环境 解压后, cd bin ./smartgit.sh 选择使用30天. 然后退出 3 绿色软件 破解步骤 下载破解文件&#xff1a;访问 Gitee 链接 goto下载下载破解文件 解压文件&#xff1a;下载后解压得到 crackSmartGit.jar 和 license.zip 用编辑…

一、基础环境配置

一、虚拟机 主&#xff1a;192.168.200.200 从&#xff1a;192.168.200.201 从&#xff1a;192.168.200.202 二、docker docker基础搭建&#xff0c;有不会的自行百度。 1.目录结构 /opt/software&#xff1a;软件包/opt/module&#xff1a;解压包&#xff0c;自定义脚本…