Dify自定义工具认证难题破解(专家级OAuth配置方案)

Dify OAuth配置真相:用JWT中继服务实现完整授权码流程 OAuth 2.0 是现代应用实现安全第三方授权的核心协议,其授权码模式(Authorization Code Flow)依赖用户参与、状态管理与令牌交换三重机制。然而在低代码LLM编排平台如Dify中,OAuth仅被抽象为静态凭证透传,缺失code交换、PKCE挑战、refresh token刷新等关键能力。这导致对接企业微信、飞书、Google等标准OAuth服务时频繁失败。本文从协议原理出发,揭示Dify工具调用生命周期中的三大断点,并提出基于独立JWT预签名中继服务的工程解法——将OAuth协议执行 阅读详情

第一章:Dify自定义工具OAuth认证概述

在构建基于Dify平台的自定义工具时,安全地集成第三方服务是关键环节。OAuth 2.0作为一种开放授权协议,允许应用在用户授权的前提下访问其在其他平台上的资源,而无需获取用户的凭证。Dify支持通过自定义工具配置OAuth认证机制,实现与主流服务(如GitHub、Google、企业微信等)的安全对接。

认证流程核心机制

OAuth认证通常包含以下步骤:
  • 用户触发调用需授权的自定义工具
  • Dify重定向至第三方授权服务器
  • 用户登录并授予访问权限
  • 授权服务器返回授权码至回调地址
  • Dify使用授权码换取访问令牌(Access Token)
  • 后续请求携带该令牌执行API调用

配置参数说明

在Dify中注册OAuth工具时,需提供如下关键信息:
参数名说明
Client ID第三方平台分配的应用唯一标识
Client Secret应用的密钥,用于身份验证
Authorization URL用户授权页面地址,如 https://github.com/login/oauth/authorize
Token URL换取令牌的接口端点
Redirect URLDify生成的回调地址,需在第三方平台白名单中注册

代码示例:定义OAuth配置

{
  "auth_method": "oauth2",
  "client_id": "your_client_id",
  "client_secret": "your_client_secret",
  "authorization_url": "https://example.com/oauth/authorize",
  "token_url": "https://example.com/oauth/token",
  "redirect_uri": "https://cloud.dify.ai/tool/callback"
}
// 配置将被Dify用于发起OAuth流程,确保所有URL正确且可访问
graph TD A[用户调用工具] --> B{是否已授权?} B -- 否 --> C[跳转至授权页面] C --> D[用户同意授权] D --> E[获取授权码] E --> F[换取Access Token] F --> G[存储令牌并执行请求] B -- 是 --> G

第二章:OAuth认证机制深度解析

2.1 OAuth 2.0核心概念与授权流程剖析

OAuth 2.0 是现代应用安全授权的基石,定义了资源所有者、客户端、资源服务器和授权服务器四类核心角色。其核心在于通过令牌(Access Token)机制实现安全的资源访问授权,避免用户凭据的直接暴露。
授权码模式流程解析
最常用的授权方式为授权码模式,适用于拥有后端服务的应用:

GET /authorize?response_type=code&client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&scope=read&state=xyz
Host: authorization-server.com
用户同意后,授权服务器重定向至回调地址并附带临时授权码。客户端随后用该码向令牌端点请求访问令牌:

POST /token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=AUTH_CODE&
redirect_uri=CALLBACK_URL&client_id=CLIENT_ID&client_secret=SECRET
此两阶段设计确保令牌不会暴露于前端,提升安全性。参数说明:`grant_type` 指定授权类型;`code` 为短期有效的授权码;`client_secret` 用于客户端身份验证。

2.2 Dify中OAuth的角色定位与集成原理

在Dify平台中,OAuth作为身份验证与授权的核心机制,承担着第三方应用安全接入的关键职责。它通过开放标准协议实现用户身份的委托验证,避免敏感凭证的直接暴露。
授权流程概览
Dify采用OAuth 2.0的授权码模式,典型流程如下:
  1. 用户访问第三方应用,触发登录请求
  2. 重定向至Dify认证服务器,用户授权
  3. 获取授权码后,应用用其换取访问令牌(Access Token)
  4. 携带令牌调用Dify API完成数据交互
关键请求示例

GET /oauth/authorize?
  response_type=code&
  client_id=abc123&
  redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback&
  scope=read write
该请求引导用户至Dify授权页面。client_id标识应用身份,scope定义权限范围,授权成功后返回一次性code,用于后继令牌交换,确保通信链路的安全性与可控性。

2.3 常见认证失败场景与安全风险分析

弱密码与暴力破解
使用简单密码或默认凭证是认证系统最常见的漏洞之一。攻击者通过自动化工具反复尝试登录,极易突破防护。
  • 常见弱密码:admin、123456、password
  • 缺乏账户锁定机制加剧风险
会话令牌泄露
认证成功后生成的会话令牌若未妥善保护,可能被窃取并用于会话劫持。
GET /api/user HTTP/1.1
Host: example.com
Cookie: sessionid=abc123xyz; Secure; HttpOnly
该请求中,尽管设置了 Secure 和 HttpOnly 标志,但若传输过程中未启用 HTTPS,仍可能在中间人攻击中泄露。
多因素认证绕过
部分系统在紧急恢复流程中允许跳过多因素验证,成为攻击入口。应严格审计此类路径,并限制使用频率。

2.4 授权模式选型:从Authorization Code到Client Credentials

在OAuth 2.0体系中,授权模式的选型直接影响系统的安全性和可用性。不同场景需匹配不同的授权流程。
常见授权模式对比
  • Authorization Code:适用于有后端的Web应用,通过中间码防止令牌暴露;
  • Client Credentials:用于服务间认证,客户端直接以自身身份获取访问令牌。
典型请求示例

POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=abc123&client_secret=xyz789
该请求使用client_credentials模式,客户端通过client_id和client_secret直接申请令牌,适用于机器对机器通信。
选型决策表
模式适用场景安全性
Authorization CodeWeb应用(含后端)高(支持PKCE)
Client Credentials服务间调用中(依赖传输加密)

2.5 Token生命周期管理与刷新机制实践

在现代身份认证体系中,Token的生命周期管理至关重要。合理的过期策略与刷新机制能兼顾安全性与用户体验。
Token有效期设计
通常采用短期访问Token(Access Token)配合长期刷新Token(Refresh Token)的双Token机制:
  • Access Token有效期较短(如15分钟),用于常规接口鉴权
  • Refresh Token有效期较长(如7天),用于获取新的Access Token
刷新流程实现
func refreshHandler(w http.ResponseWriter, r *http.Request) {
    refreshToken := r.Header.Get("X-Refresh-Token")
    if valid := validateRefreshToken(refreshToken); !valid {
        http.Error(w, "Invalid refresh token", http.StatusUnauthorized)
        return
    }
    newAccessToken := generateAccessToken()
    w.Header().Set("Access-Token", newAccessToken)
    w.WriteHeader(http.StatusOK)
}
上述代码展示了一个基础的刷新接口逻辑:验证Refresh Token合法性后签发新Access Token,避免用户频繁登录。
安全控制建议
通过黑名单机制注销失效Token,并限制Refresh Token使用次数,防止重放攻击。

第三章:自定义工具开发中的认证实现

3.1 工具端点设计与认证握手流程编码

在构建分布式工具通信架构时,端点设计需确保安全性与可扩展性。首先定义标准化的RESTful接口用于客户端与服务端的初始连接。
认证握手流程
采用基于JWT的双向认证机制,握手过程包含以下步骤:
  1. 客户端发起连接请求至/api/tool/handshake
  2. 服务端返回临时令牌(nonce)
  3. 客户端签名后回传身份凭证
  4. 服务端验证并下发长期访问令牌
func HandshakeHandler(w http.ResponseWriter, r *http.Request) {
    nonce, _ := GenerateNonce(16)
    // 设置临时挑战码
    session.Set("nonce", nonce)
    json.NewEncoder(w).Encode(map[string]string{"nonce": nonce})
}
上述代码生成随机nonce值并存入会话,防止重放攻击。客户端需使用私钥对nonce进行签名,完成身份证明。
端点安全策略
所有端点强制启用HTTPS,并通过中间件校验请求头中的X-Signature字段完整性。

3.2 动态获取Access Token的工程化方案

在高并发服务场景中,静态配置 Access Token 已无法满足安全性与可用性要求。工程化方案需实现自动刷新、线程安全与异常重试机制。
核心流程设计
  • 初始化时异步拉取 Token 并启动定时刷新协程
  • 使用读写锁保护共享 Token 变量,避免竞态条件
  • HTTP 客户端拦截请求,自动注入最新 Token
Go 实现示例
type TokenManager struct {
    token string
    mutex sync.RWMutex
}

func (tm *TokenManager) GetToken() string {
    tm.mutex.RLock()
    if tm.token != "" {
        tm.mutex.RUnlock()
        return tm.token
    }
    tm.mutex.RUnlock()
    
    tm.mutex.Lock()
    defer tm.mutex.Unlock()
    // 调用鉴权接口获取新 token
    newToken := fetchFromAuthServer()
    tm.token = newToken
    return newToken
}
上述代码通过读写锁优化高频读取场景,仅在 Token 缺失时加写锁并触发获取逻辑,减少锁竞争。fetchFromAuthServer 应集成熔断与重试策略,提升稳定性。

3.3 敏感凭证的安全存储与运行时注入策略

在现代应用架构中,敏感凭证(如数据库密码、API密钥)的硬编码已构成严重安全风险。为降低暴露概率,应采用集中式密钥管理服务(KMS)或专用密保系统进行加密存储。
使用环境变量注入凭证
应用启动时从安全源加载凭证,并通过环境变量注入,避免明文写入配置文件:
export DB_PASSWORD=$(vault read -field=password secret/prod/db)
该命令从HashiCorp Vault中读取加密后的密码字段并赋值给环境变量,确保运行时才解密加载。
多层防护策略对比
方式安全性适用场景
明文配置文件低本地开发
环境变量中容器化部署
KMS动态获取高生产环境

第四章:专家级配置实战与调优

4.1 多服务商OAuth配置模板(GitHub/Google/企业微信)

在构建支持多身份源的系统时,统一的OAuth配置模板能显著提升集成效率。以下为常见服务商的基础配置结构。
通用配置字段说明
  • client_id:应用在服务商注册后分配的唯一标识
  • client_secret:用于签名请求的密钥
  • redirect_uri:授权回调地址,需与注册时一致
  • scope:请求的权限范围,不同服务商支持的值不同
配置示例
{
  "github": {
    "client_id": "your_github_client_id",
    "client_secret": "your_github_client_secret",
    "authorization_url": "https://github.com/login/oauth/authorize",
    "token_url": "https://github.com/login/oauth/access_token",
    "scope": "user:email"
  },
  "google": {
    "client_id": "your_google_client_id",
    "client_secret": "your_google_client_secret",
    "authorization_url": "https://accounts.google.com/o/oauth2/auth",
    "token_url": "https://oauth2.googleapis.com/token",
    "scope": "openid email profile"
  }
}
上述JSON模板定义了GitHub和Google的OAuth端点与凭证信息。其中,authorization_url用于跳转用户至授权页面,token_url用于换取访问令牌。企业微信等国内服务可参照此结构,替换为对应的API地址与权限模型。

4.2 自签名证书与内网穿透环境下的认证调试

在开发和测试阶段,自签名证书常用于模拟 HTTPS 环境。由于其未被公共信任链签署,需手动将证书添加至客户端信任库。
生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
该命令生成有效期为一年的本地证书,-nodes 表示私钥不加密,适用于开发环境。
内网穿透场景下的信任处理
使用 frp 或 ngrok 进行内网穿透时,客户端访问外网映射地址会触发证书域名不匹配警告。解决方案包括:
  • 配置客户端忽略特定证书错误(仅限调试)
  • 将自签名证书导入系统或应用级信任存储
  • 使用 DNS 验证的免费 CA 如 Let's Encrypt(若支持)
通过合理配置,可实现安全且可调试的本地 HTTPS 服务暴露。

4.3 高并发场景下的Token复用与缓存优化

在高并发系统中,频繁生成和校验Token会显著增加认证服务的压力。通过合理的复用机制与缓存策略,可有效降低开销。
Token本地缓存设计
采用LRU缓存存储已验证的Token,避免重复解析。结合TTL控制失效时间,平衡安全与性能。
缓存策略命中率平均延迟(ms)
Redis集中式82%15
本地Caffeine95%2
多级缓存协同

// 使用Caffeine构建本地缓存
Cache<String, TokenInfo> cache = Caffeine.newBuilder()
    .maximumSize(10000)
    .expireAfterWrite(5, TimeUnit.MINUTES)
    .build();
该配置限制缓存大小并设置写后过期,防止内存溢出。TokenInfo包含用户身份与权限信息,减少数据库查询。

4.4 日志追踪与认证链路可视化监控

在分布式系统中,完整的请求链路追踪是保障系统可观测性的关键。通过引入唯一追踪ID(Trace ID)贯穿请求生命周期,可实现跨服务的日志关联与认证流程回溯。
分布式追踪实现机制
使用OpenTelemetry等标准框架注入Trace ID,并在HTTP头中传递:
// 在Go中间件中注入Trace ID
func TraceMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        traceID := r.Header.Get("X-Trace-ID")
        if traceID == "" {
            traceID = uuid.New().String()
        }
        ctx := context.WithValue(r.Context(), "trace_id", traceID)
        w.Header().Set("X-Trace-ID", traceID)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}
上述代码确保每个请求携带唯一标识,便于日志聚合分析。
认证链路可视化
通过ELK或Jaeger收集日志并构建调用链视图,可清晰展示从用户登录、Token验证到资源访问的完整路径。典型监控指标包括:
  • 认证延迟分布
  • Token失效频率
  • 跨服务调用成功率

第五章:未来认证架构演进与生态展望

去中心化身份的实践路径
随着区块链技术的成熟,去中心化身份(DID)正逐步进入企业级应用。例如,微软的ION项目基于比特币网络构建DID系统,允许用户在无需中心化注册机构的情况下管理身份。开发者可通过以下Go代码片段解析DID文档:

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type DIDDocument struct {
	Context    interface{}          `json:"@context"`
	ID         string               `json:"id"`
	PublicKey  []map[string]string  `json:"publicKey"`
	Authentication []string         `json:"authentication"`
}

func main() {
	didJSON := `{
		"@context": "https://w3id.org/did/v1",
		"id": "did:ion:EiA:...",
		"publicKey": [{
			"id": "#key-1",
			"type": "Secp256k1VerificationKey2018",
			"publicKeyHex": "04aabc..."
		}],
		"authentication": ["#key-1"]
	}`
	
	var doc DIDDocument
	if err := json.Unmarshal([]byte(didJSON), &doc); err != nil {
		log.Fatal(err)
	}
	fmt.Printf("DID: %s\n", doc.ID)
}
零信任模型下的动态认证
现代安全架构要求持续验证用户行为。Google BeyondCorp模型通过设备指纹、登录上下文和行为分析实现动态访问控制。典型策略配置如下表所示:
风险等级认证方式访问权限
低MFA + 设备证书完全访问
中强制重新认证受限API调用
高人工审批 + IP封锁仅审计视图
跨域身份联邦的新范式
OpenID Connect Federation 正在成为多组织身份互信的标准方案。欧洲教育科研网GÉANT利用该协议连接30余国学术身份提供商,实现单点登录跨域资源。核心优势包括:
  • 自动化元数据交换
  • 分级信任锚配置
  • 支持短期令牌委托
Dify部署避坑指南:详解用户认证密钥配置与安全实践 在AI应用开发与部署中,用户认证体系是保障系统安全的核心基础,其原理主要依赖于密钥加密、哈希算法和令牌机制。通过环境变量配置实现认证,是确保应用访问控制与数据安全的关键技术手段,对于构建稳定、可信的AI服务具有重要价值。该技术广泛应用于各类需要用户登录、API访问控制和第三方集成的Web应用与服务平台。本文聚焦于Dify这一AI应用开发平台的认证密钥配置,深入剖析了SECRET_KEY、HASH_SALT等核心环境变量的生成标准、作用原理及安全存储方案,并针对多环境部署与密钥轮换等常见痛点提供了详细的避坑指 阅读详情

相关推荐

Dify安全加固实战:从认证绕过到容器逃逸的三大高危漏洞防护

在AI应用开发与部署领域,系统安全是保障业务连续性和数据隐私的基石。其核心原理在于通过身份认证、访问控制和最小权限原则构建纵深防御体系。对于采用Dify等低代码平台快速构建AI应用的技术团队而言,忽视生产环境安全配置将带来巨大技术债务与业务风险。本文聚焦于AI应用平台部署中最常见且高危的实践漏洞:默认弱口令导致的未授权访问,可致API密钥与知识库数据泄露;环境变量硬编码引发的敏感信息泄露,使密钥在代码仓库与容器中“裸奔”;以及容器权限配置不当可能引发的权限提升与横向移动风险。通过剖析这些漏洞的形成机制与潜在

weixin_33709219的博客 436

利用nginx完成iframe请求的身份认证

摘要:本文介绍了如何通过Nginx的auth_request模块解决Dify应用嵌入网站后的安全认证问题。主要内容包括:1)问题背景:直接访问iframe URL会绕过网站登录;2)解决方案:利用Nginx配置认证代理,通过访问系统首页验证登录状态;3)具体步骤:Nginx安装配置、代理设置、路径重写规则及错误处理;4)操作要点:修改iframe请求地址匹配认证路径,保持Dify原有地址不变。该方法无需修改Dify应用,仅通过Nginx配置即可实现访问控制,确保只有登录用户才能访问嵌入的Dify应用。

每天学习一点点 1473

Dify知识库等保2.0三级认证:7大加密策略与审计日志配置实战

数据加密与安全审计是构建企业级信息系统安全基石的通用技术。加密技术通过对敏感信息进行编码转换,确保数据在存储和传输过程中的机密性与完整性,其核心原理在于利用密码学算法和密钥管理体系。安全审计则通过系统性地记录、分析和留存用户与系统的行为日志,为事件追溯、合规证明与威胁检测提供不可篡改的证据链,其技术价值在于实现行为的可追溯性与不可否认性。这两项技术共同构成了满足网络安全等级保护(等保)要求,特别是等保2.0三级认证中关于数据安全与审计追溯核心条款的关键支撑。在AI应用开发平台Dify的知识库部署场景下,面对

weixin_34224941的博客 350

Dify 中的 @login_required 装饰器

本文主要介绍了 Dify 中的 @login_required 装饰器的具体实现过程,用于确保用户在调用视图函数之前已经登录和认证。源码位置:dify\api\libs\login.py。

NLP工程化 1921

Dify私有化部署权限安全:三大漏洞解析与RBAC实战加固指南

在软件系统开发中,权限管理是保障数据安全与业务隔离的核心机制,其原理基于访问控制模型(如RBAC)对用户操作进行授权与限制。良好的权限体系能有效防止数据泄露与越权访问,对于企业级应用至关重要。本文聚焦于AI应用开发平台Dify在私有化部署场景下的权限配置,深入剖析因默认配置宽松、RBAC模型粗粒度及前后端校验不一致导致的典型安全漏洞。通过结合用户认证、角色权限等热词,提供从安全初始化、精细化权限设计到持续监控的完整工程实践方案,旨在帮助架构师与运维人员构建坚固的权限防线,确保AI应用在企业环境中的安全稳定运

weixin_30567225的博客 465

OpenClaw:AI服务统一认证网关与Token中转中间件

在大模型应用快速落地的背景下,AI服务接入常面临多源模型、异构认证协议(OAuth2/OIDC/JWT)和地域策略限制等挑战。OpenClaw 作为一款面向开发者的协议层抽象工具,核心原理是将模型后端解耦为可插拔插件,通过标准化 token 生命周期管理、身份路由与 region-aware 中继机制,实现跨平台认证协议的自动适配与安全续期。其技术价值在于降低AI基础设施的集成复杂度,提升token调度自主性与合规可控性,广泛适用于金融、跨境电商、SaaS等需私有化部署与多模型协同的生产场景。本文聚焦 Op

weixin_29189381的博客 289

Dify 1.7.0 正式发布:你期待的 OAuth 登录终于来了!

还在为插件版本烦恼?Dify v1.7.0 OAuth +自动升级+回滚功能上线!功能全解析你一定要知道!

sinat_29950703的博客 1771

操作系统原理:【优麒麟】linux内核添加系统调用

在底端添加如下代码。

Joyce_zz的博客 2709

dify-plus 1.2.0 重磅发布:OAuth2.0登录、独立二开表支持,企业级功能全面升级!

各位开发者朋友们,Dify-plus 1.2.0 版本正式上线啦!本次更新不仅合并了 Dify 官方 1.2.0 的最新功能,还针对企业级用户和二开需求进行了深度优化,新增 OAuth2.0 登录、独立数据表管理,并修复了多个核心 Bug。Dify-plus 1.2.0 是团队为企业用户和二开场景量身定制的版本,无论是安全性、稳定性还是扩展性都迈上了新台阶。“OAuth2.0 登录节省了我们大量的开发时间,集成非常流畅!本次升级涉及数据库结构调整,请务必提前备份数据,避免意外丢失!

福大大架构师每日一题 1528

图像去雾常见数据集

上述数据集涵盖了室内、室外、真实和合成等多种场景,可以满足不同研究需求。在选择数据集时,建议根据具体任务的应用场景和目标选择合适的数据集,例如真实雾天图像适合模型的实际应用验证,而合成数据则适合模型的快速迭代和训练。希望本文能为从事图像去雾研究的朋友提供一些帮助!

m0_68604571的博客 6334

5G-A无源物联网:深度解析“不插电“智能的底层技术原理

北京移动推出5G-A无源物联网技术,实现电动车标签"零功耗"运行。该技术通过射频能量收集(利用5G-A基站高功率信号转换为电能)和反向散射通信(调制反射信号传输数据)两大核心技术,使设备无需电池即可工作。5G-A相比4G在信号能量密度、通信速率和定位精度等方面显著提升,结合通感一体等创新技术,为无源物联网提供商用基础。该方案已在北京小区试点应用,实现电动车精准定位管理,标签寿命可达5年以上。专家预测,这项技术将大幅降低物联网部署成本,推动"万物智联"时代的到来。

通信行业老兵、物联网从业者,做一个有趣的普通人。 2014

Dify-10:租户管理

用户账户:注册、认证、资料管理工作区(租户):包含独立成员和资源的组织单元成员与角色:工作区内的基于角色访问控制(RBAC)认证流程:支持密码、邮箱验证码、OAuth 等多种认证方式该系统通过提供身份和访问控制,与 RAG 知识系统(参见 RAG 知识系统)、对话系统(参见 对话系统)等组件集成。

uncle_ll的博客 2542

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 380

Dify镜像集成OAuth2认证保护应用访问

通过集成OAuth2,Dify可与企业统一身份系统对接,禁用本地账户、防止未授权访问,提升AI应用平台的安全性与协作效率。利用标准授权码流程和JWT验证中间件,实现单点登录、精细权限控制和合规审计,适用于金融、医疗等高安全要求场景。

weixin_28913879的博客 949

Eplan P8 API二次开发--插入符号(Symbol)功能(Function)并定义属性

1、目的 使用Eplan API在页中自动插入某个符号并按约定规则自动设置好属性 2. 步骤 一、基础信息 比如要在Eplan中自动插入一个电机的符号并定制属性,我们先要确定要插入的符号名,可以在Eplan中获取如下符号(Symbol)信息 可以知道我们待插入的符号名称为M3_1, 接下来,使用Visual Studio建立类库项目,并引用Eplan Api库 二、获取符号变量(SymbolVariant) 在Eplan中,当一个符号(Symbol)被插入到页中,这个符号的引用即变为一个(Function

如是道程序人生 4529

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

【Dify开发者必看】:3种高效API鉴权方案,提升工具调用安全性90%

掌握Dify自定义工具调用API鉴权的3种高效方案,解决鉴权不安全、调用易被滥用难题。适用于AI应用开发、第三方服务集成等场景,支持密钥签名、OAuth2.0与JWT验证,提升安全性90%。方法实用,配置简单,值得收藏

PoliVein的博客 1234

MIPI转LVDS芯片调试实战:从Kernel到UEFI的完整点亮流程

本文详细解析了MIPI转LVDS芯片调试的全流程,从Kernel驱动开发到UEFI早期初始化,涵盖I2C通信、电源时序控制等核心挑战。通过LT9211芯片实战案例,提供设备树配置、电源时序优化及显示异常排查等实用技巧,助力工程师高效完成屏幕调试工作。

weixin_30314813的博客 450

如何在24小时内完成Dify私有化系统的全面安全加固?

快速掌握Dify私有化安全加固核心方法,24小时内完成系统全面防护。适用于企业本地部署场景,涵盖权限控制、网络隔离、漏洞修复与日志审计等关键措施,确保数据安全与合规性。操作高效,流程清晰,值得收藏。

LiteTrans的博客 949

基于STM32、HAL库的ICP-20100气压传感器 驱动程序设计

它具有低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。#define ICP20100_FIFO_CTRL 0x09 // FIFO控制寄存器。#define ICP20100_FIFO_DATA 0x0A // FIFO数据寄存器。#define ICP20100_FIFO_STS 0x0B // FIFO状态寄存器。#define ICP20100_FIFO_WTM 0x15 // FIFO水印设置。

corlin6688的博客 600

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Dify API安全加固指南:如何在1小时内完成鉴权体系升级?

快速掌握Dify自定义工具调用API鉴权方法,提升系统安全性。适用于AI工作流集成场景,通过密钥管理与身份验证机制实现高效防护。操作简单,1小时内完成升级,保障接口调用安全可靠,值得收藏。

PixelWander的博客 1042

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Dify中JWT密钥设置的8个关键步骤:打造坚不可摧的用户认证体系

掌握Dify用户认证JWT密钥设置的完整流程,提升系统安全与身份验证可靠性。涵盖密钥生成、配置、刷新及权限控制等8个关键步骤,适用于API保护、多端登录等场景。方法实用、操作清晰,助你构建高安全认证体系,值得收藏。

IterStream的博客 412

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

私有化部署Dify后,你必须立即执行的7项安全加固措施

部署Dify后如何提升系统安全性?本文分享Dify私有化安全加固必备的7项措施,涵盖权限控制、访问防护、数据加密等关键步骤,适用于企业级AI应用部署场景。有效防范未授权访问与数据泄露风险,保障系统稳定合规,值得收藏。

FuncTide的博客 684

为什么你的Dify私有化部署总出用户权限漏洞?90%的人都忽略了这3个关键点

掌握私有化 Dify 的用户管理关键技巧,避免常见权限漏洞。本文揭示90%人忽略的3大核心问题,涵盖部署场景、角色权限配置与安全策略优化,助你构建安全可控的系统。方法实用,值得收藏。

ByteVein的博客 642

避开这3个坑!用Dify聚合B站/微博/头条热榜的正确姿势

本文详细解析了使用Dify聚合B站、微博、头条热榜时常见的三大问题:微博授权失效、多平台数据格式冲突和动态参数匹配失灵。通过真实案例和代码示例,提供了解决方案,如自动刷新微博token、数据归一化处理和健壮性工作流配置,帮助用户高效获取实时热点信息。

weixin_28339967的博客 366

OpenClaw本地JWT认证中枢:为Ollama构建可控身份门禁

JWT(JSON Web Token)是一种轻量、自包含的身份凭证标准,其核心原理是通过数字签名保障声明(claims)的完整性与真实性。在本地大模型工作流中,JWT的价值在于将身份验证逻辑从云服务解耦,实现离线可验、权限可声明、密钥可自治的技术闭环。典型应用场景包括Ollama等无用户体系的本地推理服务接入Dify/LangChain等上层平台,或满足内网隔离、多角色模型分级调用、合规密钥自主管控等工程需求。OpenClaw正是基于HS256 JWT协议构建的极简本地签发与验证中枢,不依赖外部服务,真正实

weixin_29323551的博客 260
上一篇: ggplot2图表美化实战(theme_text size设置全解析)
下一篇: 【Dify高级开发秘籍】:跨模型会话上下文传递的底层机制与实践
InitPulse
博客等级 码龄1年 160粉丝 2028原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值