kamailio-auth模块详解【以下内容来源于官网,本文只做翻译】
以下是《Auth 模块》文档的中文翻译:
Auth 模块
作者:Jan Janak
FhG Fokus
jan@iptel.org
Juha Heinanen
TutPro Inc
jh@song.fi
Daniel-Constantin Mierla
asipto.com
miconda@gmail.com
版权所有 © 2002, 2003 FhG FOKUS
官网链接:
https://kamailio.org/docs/modules/6.0.x/modules/tm.html
目录
- 管理员指南
- 概述
- 依赖
- 参数
3.1. auth_checks_register (flags)
3.2. auth_checks_no_dlg (flags)
3.3. auth_checks_in_dlg (flags)
3.4. qop (string)
3.5. nonce_count (boolean)
3.6. one_time_nonce (boolean)
3.7. nid_pool_no (integer)
3.8. nc_array_size (integer)
3.9. nc_array_order (integer)
3.10. otn_in_flight_no (integer)
3.11. otn_in_flight_order (integer)
3.12. secret (string)
3.13. nonce_expire (integer)
3.14. nonce_auth_max_drift (integer)
3.15. force_stateless_reply (boolean)
3.16. realm_prefix (string)
3.17. use_domain (boolean)
3.18. algorithm (string)
3.19. add_authinfo_hdr (boolean) - 函数
4.1. consume_credentials()
4.2. has_credentials(realm)
4.3. www_challenge(realm, flags)
4.4. proxy_challenge(realm, flags)
4.5. auth_challenge(realm, flags)
4.6. pv_www_authenticate(realm, passwd, flags [, method])
4.7. pv_proxy_authenticate(realm, passwd, flags)
4.8. pv_auth_check(realm, passwd, flags, checks)
4.9. auth_get_www_authenticate(realm, flags, pvdest)
4.10. auth_algorithm(algorithm)
示例列表
1.1. 设置 auth_checks_register 模块参数
1.2. qop 示例
1.3. nonce_count 示例
1.4. one_time_nonce 示例
1.5. nid_pool_no 示例
1.6. nc_array_size 示例
1.7. nc_array_order 示例
1.8. otn_in_flight_no 示例
1.9. otn_in_flight_order 示例
1.10. 设置 secret 模块参数
1.11. nonce_expire 示例
1.12. nonce_auth_max_drift 示例
1.13. force_stateless_reply 示例
1.14. realm_prefix 参数示例
1.15. force_stateless_reply 示例
1.16. 使用 SHA-256 示例
1.17. 添加 Authentication-Info 头示例
1.18. consume_credentials 示例
1.19. consume_credentials 示例
1.20. www_challenge 使用示例
1.21. proxy_challenge 使用示例
1.22. auth_challenge 使用示例
1.23. pv_www_authenticate 使用示例
1.24. pv_proxy_authenticate 使用示例
1.25. pv_auth_check 使用示例
1.26. auth_get_www_authenticate
1.27. auth_algorithm 示例
第 1 章 管理员指南
1. 概述
这是一个通用模块,本身并不提供所有认证所需的功能,但提供了其他认证相关模块(称为认证后端)所需的功能。
我们将认证代码分为多个模块,因为现在有多个后端(目前支持数据库认证和 RADIUS)。这使我们能够创建单独的包,用户只需安装和加载所需的功能。这也避免了二进制包中不必要的依赖。
2. 依赖
在使用此模块之前,必须加载以下模块:
- sl - 无状态回复。
3. 参数
3.1. auth_checks_register (flags)
参见 auth_checks_in_dlg
参数的描述。
3.2. auth_checks_no_dlg (flags)
参见 auth_checks_in_dlg
参数的描述。
3.3. auth_checks_in_dlg (flags)
这三个模块参数控制在 SIP MD5 摘要认证期间对携带摘要响应的 SIP 消息执行哪些可选的完整性检查。auth_checks_register
控制对 REGISTER 消息的完整性检查,auth_checks_no_dlg
控制对没有 To 头字段或没有 To 标签的 SIP 请求(即建立对话或对话外的请求)的可选完整性检查,auth_checks_in_dlg
控制对对话内的 SIP 请求(如 BYE 或 re-INVITE)的完整性检查。所有三个参数的默认值为 0(旧行为,无额外检查)。
启用额外检查后,nonce 将包括对消息的选定部分(见下文)和其他密钥的额外 MD5 哈希。这将用于检查当 UA 尝试重用 nonce 时,消息的选定部分是否相同,从而保护或严重限制重放攻击。
所有三个参数的可能标志值为:
- 1:检查消息 URI 是否更改(使用整个 URI)
- 2:检查 Call-ID
- 4:检查 From 标签
- 8:检查源 IP 地址(参见 nonce.h)
例如,将 auth_checks_register
设置为 3 将检查 REGISTER 消息的 Call-ID 或请求 URI 是否从生成原始 nonce 的 REGISTER 消息中更改(这将允许在同一 UA 内且在有效期内重用 nonce)。启用额外检查将限制 UA 的 nonce 缓存,需要额外的挑战和往返,但会提供更好的保护。
警告:除非您确定所有用户代理在被挑战时不会更改 From 标签,否则不要为 REGISTER 消息(auth_checks_register
)和对话外消息(auth_checks_no_dlg
)启用 From 标签检查(4)。某些用户代理在挑战请求不在对话中时也会更改 Call-ID,因此避免为非对话消息启用 Call-ID 检查(2)。在某些罕见情况下,这也需要为 REGISTER 消息完成。
当设置了 secret
参数并启用了额外检查时,secret
的前半部分将用于过期时间的 MD5,另一半用于额外检查的 MD5,因此请确保您有一个长密钥(建议 32 个字符或更长)。
示例 1.1. 设置 auth_checks_register 模块参数
...
# 对于 REGISTER 请求,我们将请求 URI、Call-ID 和请求的源 IP 哈希到 nonce 字符串中。
# 这确保生成的凭据不能与其他注册器、具有其他源 IP 地址或 Call-ID 的用户代理一起使用。
# 请注意,如果启用此功能,每次 REGISTER 消息更改 Call-ID 的用户代理将无法注册。
modparam("auth", "auth_checks_register", 11)# 对于建立对话的请求(如原始 INVITE、OPTIONS 等),我们哈希请求 URI 和源 IP。
# 哈希 Call-ID 和 From 标签需要额外的预防措施,因为这些检查可能会使某些 UA 无法使用。
modparam("auth", "auth_checks_no_dlg", 9)# 对于对话中的请求,如 re-INVITE,我们可以像前一种情况一样哈希源 IP 和请求 URI。
# 此外,我们可以哈希 Call-ID 和 From 标签,因为这些在对话中是固定的,保证不会更改。
# 此设置有效地将生成的凭据的使用限制为单个对话中的单个用户代理。
modparam("auth", "auth_checks_in_dlg", 15)
...
3.4. qop (string)
如果设置,则为挑战启用 qop:每个挑战将包含一个 qop 参数。这是推荐的方式,但一些较旧的非 RFC3261 兼容的 UA 可能会感到困惑,并且在启用 qop
时可能无法正确认证。
启用 qop
和 nonce_count
将提供额外的安全性(防止重放攻击),同时仍允许 UA 侧的凭据缓存,从而不影响性能。
可能的值为:“auth”、“auth-int” 和 “”(未设置)。
默认值为未设置("")。
另请参见:nonce_count
。
示例 1.2. qop 示例
...
modparam("auth", "qop", "auth") # 设置 qop=auth
...
3.5. nonce_count (boolean)
如果启用,则记住接收到的 nc 值并检查其是否大于先前的值(对于成功的认证,接收到的 nc 必须大于先前接收到的值,详见 RFC2617)。这将提供防止重放攻击的保护,同时仍允许 UA 侧的凭据缓存。
它依赖于 qop
的启用(如果未启用 qop
,挑战将不包括 qop,因此 UA 可能不会在其响应中包含 qop 或 nc 参数)。
如果响应不包括 qop 或 nc(例如不支持它们的旧 UA),则响应将根据其他启用的 nonce 检查进行检查,顺序为:one_time_nonce
和 auth_checks_*
。如果响应仅包括 nc,则仅执行正常检查和 nonce_count
检查,所有其他检查将被忽略。
检查通过跟踪有限数量的 nonce 来工作。最大跟踪 nonce 数使用 nc_array_size
或 nc_array_order
参数设置。如果超过此数量,较旧的条目将被覆盖。只要可挑战消息的平均响应时间的最大速率低于 nc_array_size
,检查应该可以正常工作。为了获得最佳性能(最大重用缓存凭据),nc_array_size
除以 nid_pool_no
应低于消息速率乘以所需的 nonce_expire
。
最大接受的 nc 值为 255。如果 nc 大于此值,nonce 将被视为过时,UA 将被重新挑战。
注意:nonce_count
应仅在状态模式下启用(应在认证检查之前创建事务以吸收可能的重新传输,并且所有回复应使用 t_reply()
以状态方式发送)。如果在无状态模式下使用 nonce_count
和认证检查,则所有重新传输都将被挑战。
默认值为 0(关闭)。
另请参见:qop
、nc_array_size
、nc_array_order
、nid_pool_no
、nonce_expire
、one_time_nonce
。
示例 1.3. nonce_count 示例
...
modparam("auth", "nonce_count", 1) # 启用 nonce_count 支持
modparam("auth", "qop", "auth") # 启用 qop=auth....
route{
...# 进入状态模式并捕获重新传输if (!t_newtran()) {xlog("L_NOTICE", "Failed to create new transaction\n");drop;};if (method=="REGISTER"){if (!www_authenticate("test", "credentials")){# 必须使用 t_reply 发送回复,因为此时事务已经创建#(我们处于“状态”模式)if ($? == -2){t_reply("500", "Internal Server Error");}else if ($? == -3){t_reply("400", "Bad Request");}else{if ($digest_challenge)append_to_reply("%$digest_challenge");t_reply("401", "Unauthorized");}drop;}if (!save_noreply("location")) {t_reply("400", "Invalid REGISTER Request");drop;}append_to_reply("%$contact");t_reply("$code", "$reason"); # 不使用 %,直接使用 avpsdrop;}else{if (!proxy_authenticate("my_realm", "credentials")){if ($? == -2){t_reply("500", "Internal Server Error");}else if ($? == -3){t_reply("400", "Bad Request");}else{if ($digest_challenge)append_to_reply("%$digest_challenge");t_reply("401", "Unauthorized");}drop;}}
...
3.6. one_time_nonce (boolean)
如果设置为 1,则禁用 nonce 重用:每个 nonce 仅允许使用一次,即在第一次响应挑战时。所有消息都将被挑战,即使是重新传输。应使用状态模式,以在认证检查之前捕获重新传输(使用 t_newtran()
并在认证检查之前使用 t_reply()
发送所有回复)。
one_time_nonce
提供了增强的重放保护,但代价是使 UA 侧的凭据缓存无效,挑战每条消息(从而生成额外的消息和额外的往返)并要求状态模式。通常应优先使用 qop
和 nonce_count
(如果可能),并回退到 auth_checks_*
。由于上述缺点,仅当 auth_checks_register
、auth_checks_no_dlg
和 auth_checks_in_dlg
提供的额外检查被认为不足以满足特定设置时,才应使用 one_time_nonce
。
与 nonce_count
相比,one_time_nonce
提供了相同的保护,但消息成本更高。唯一的优点是它适用于不支持 qop 和 nc 的用户代理,并且对于相同的最大在途 nonce 数,它使用的内存更少(减少 8 倍)。当 UA 不支持 nc 时,one_time_nonce
可以作为 nonce_count
的备用(当两者都启用时,它会自动发生)。
与 nonce_count
类似,one_time_nonce
通过跟踪有限数量的 nonce 来工作。最大跟踪 nonce 数使用 otn_in_flight_no
或 otn_in_flight_order
参数设置。如果超过此数量,较旧的条目将被覆盖。只要可挑战消息的平均响应时间的最大速率低于 otn_in_flight_no
,检查应该可以正常工作。
默认值为 0(关闭)。
另请参见:otn_in_flight_no
、otn_in_flight_order
、nid_pool_no
、nonce_count
。
示例 1.4. one_time_nonce 示例
...
modparam("auth", "one_time_nonce", 1)
# 注意:应使用状态模式,参见 nonce_count 示例
...
3.7. nid_pool_no (integer)
控制 nonce_count
和 one_time_nonce
数组的分区数(为减少 nonce 大小,两者共用)。
可以将这些数组分为多个分区,而不是使用单个数组来保持 nonce 状态。每个 Kamailio 进程被分配到一个分区,从而在多 CPU 机器上实现更高的并发性。除了提高性能外,增加 nid_pool_no
也有负面影响:在某些情况下,它可能会减少支持的最大在途 nonce 数。在最坏的情况下,当只有一个 Kamailio 进程接收大部分流量时(例如,两个代理之间的非常繁忙的 TCP 连接),在途 nonce 可能限制为数组大小(nc_array_size
用于 nonce_count
或 otn_in_flight_no
用于 one_time_nonce
)除以分区数(nid_pool_no
)。然而,对于正常流量,当接收消息的进程是随机选择或以轮询方式选择时,最大在途 nonce 数将很少受到 nid_pool_no
的影响(消息将接近均匀地分布到使用不同分区的进程)。
nid_pool_no
值应为以下之一:1、2、4、8、16、32 或 64(最大值为 64,所有值应为 2^k 形式,否则将向下舍入为 2^k)。
默认值为 1。
另请参见:nonce_count
、one_time_nonce
、nc_array_size
、otn_in_flight_no
。
示例 1.5. nid_pool_no 示例
...
modparam("auth", "nid_pool_no", 4)
...
3.8. nc_array_size (integer)
nonce_count
的最大在途 nonce 数。它表示将保持状态的最大 nonce 数。当超过此数量时,较旧的 nonce 的状态将被丢弃以为新的 nonce 腾出空间(详见 nonce_count
)。
值应为 2^k 形式。如果不是,则向下舍入为 2^k(例如,值 1000000 将向下舍入为 2^19=524288)。可以使用 nc_array_order
直接指定 2 的幂(例如,设置为 20 等同于设置为 1048576)。
用于保持 nonce 状态的内存将为 nc_array_size
字节。
默认值为 1048576(1M 在途 nonce,使用 1Mb 内存)。
另请参见:nonce_count
、nid_pool_no
。
示例 1.6. nc_array_size 示例
...
modparam("auth", "nc_array_size", 4194304) # 4Mb
...
3.9. nc_array_order (integer)
等同于 nc_array_size
,但不是直接指定大小,而是指定 2 的幂(log2())。
nc_array_size = 2^nc_array_order
。有关更多详细信息,请参见 nc_array_size
。
默认值为 20(1M 在途 nonce,使用 1Mb 内存)。
另请参见:nonce_count
、nc_array_size
、nid_pool_no
。
示例 1.7. nc_array_order 示例
...
modparam("auth", "nc_array_order", 22) #...
3.10. otn_in_flight_no (integer)
one_time_nonce
的最大在途 nonce 数。它表示为一次性 nonce 检查记住的最大 nonce 数。当超过此数量时,较旧的 nonce 的信息将被丢弃并覆盖为新生成的 nonce 的信息(详见 one_time_nonce
)。
值应为 2^k 形式。如果不是,则向下舍入为 2^k(例如,值 1000000 将向下舍入为 2^19=524288)。可以使用 otn_in_flight_order
直接指定 2 的幂(例如,设置为 19 等同于设置为 524288)。
用于保持 nonce 信息的内存将为 otn_in_flight_no
除以 8(每个 nonce 仅保留 1 位状态)。
默认值为 1048576(1M 在途 nonce,使用 128Kb 内存)。
另请参见:one_time_nonce
、nid_pool_no
。
示例 1.8. otn_in_flight_no 示例
...
modparam("auth", "otn_in_flight_no", 8388608) # 8 Mb (1Mb 内存)
...
3.11. otn_in_flight_order (integer)
等同于 otn_in_flight_no
,但不是直接指定大小,而是指定 2 的幂(log2())。
otn_in_flight_no = 2^otn_in_flight_order
。有关更多详细信息,请参见 otn_in_flight_order
。
默认值为 20(1M 在途 nonce,使用 128Kb 内存)。
另请参见:one_time_nonce
、otn_in_flight_no
、nid_pool_no
。
示例 1.9. otn_in_flight_order 示例
...
modparam("auth", "otn_in_flight_order", 23) # 8 Mb (1Mb 内存)
...
3.12. secret (string)
用于计算 nonce 值的密钥短语,用于挑战客户端进行认证。
如果在您的安装中使用多个服务器,并希望在第二个服务器上针对第一个服务器生成的 nonce 进行认证,则必须在所有服务器上显式设置相同的 secret
。然而,由于使用共享(且固定)的密钥作为 nonce 是不安全的,最好保持默认值。任何客户端应将认证请求发送到发出挑战的服务器。
默认值为随机生成的字符串。
示例 1.10. 设置 secret 模块参数
...
modparam("auth", "secret", "johndoessecretphrase")
...
3.13. nonce_expire (integer)
Nonce 具有有限的生命周期。在给定时间段后,nonce 将被视为无效。这是为了防止重放攻击。包含过时 nonce 的凭据将不被授权,但用户代理将再次被挑战。这次挑战将包含 stale
参数,这将向客户端指示它不必打扰用户询问用户名和密码,它可以使用现有的用户名和密码重新计算凭据。
值为秒,默认值为 300 秒。
示例 1.11. nonce_expire 示例
...
modparam("auth", "nonce_expire", 600) # 设置 nonce_expire 为 600 秒
...
3.14. nonce_auth_max_drift (integer)
nonce 创建时间与当前时间之间的最大差异(以秒为单位),如果 nonce 创建时间似乎在未来。
在某些情况下,例如系统时间向后调整后不久,或当当前代理是未时间同步的集群的一部分时,可能会收到一个创建时间在未来的 nonce。在这种情况下,如果差异大于 nonce_auth_max_drift
秒,则认为 nonce 过时并重新挑战(否则在时间大幅向后调整后,某些先前生成的 nonce 可能会在太长时间内有效)。
默认值为 3 秒。
另请参见:nonce_expire
。
示例 1.12. nonce_auth_max_drift 示例
...
modparam("auth", "nonce_auth_max_drift", 1) # 设置最大差异为 1 秒
...
3.15. force_stateless_reply (boolean)
如果设置为 1,www_challenge()
和 proxy_challenge()
函数将无状态地发送回复,无论是否存在事务。如果设置为 0(默认),则如果存在事务,则以状态方式发送回复,否则以无状态方式发送。
示例 1.13. force_stateless_reply 示例
...
modparam("auth", "force_stateless_reply", 1)
...
3.16. realm_prefix (string)
自动从 realm 中剥离的前缀。作为 SRV 记录的替代方案(并非所有 SIP 客户端都支持 SRV 查找),可以为 SIP 目的定义主域的子域(如 sip.mydomain.net 指向与 mydomain.net 的 SRV 记录相同的 IP 地址)。通过忽略 realm_prefix “sip.”,在认证时,sip.example.com 将等同于 example.com。
默认值为空字符串。
示例 1.14. realm_prefix 参数示例
modparam("auth", "realm_prefix", "sip.")
3.17. use_domain (boolean)
如果设置为 1,pv_auth_check()
使用 URI 的域部分来检查用户身份。
示例 1.15. force_stateless_reply 示例
...
modparam("auth", "use_domain", 1)
...
3.18. algorithm (string)
配置用于摘要认证的哈希算法。可能的值为 “MD5” 或 “SHA-256”。如果留空,则使用 MD5。如果指定,则使用指定的算法,并将其放入挑战头的 ‘algorithm’ 字段中。
警告:SHA-256 哈希值占用 MD5 哈希值的两倍空间。因此,如果此选项与另一个未分配至少 65 字节来存储哈希值的 auth_* 模块一起使用,可能会发生缓冲区溢出。SHA-256 可以安全地与 auth_db 模块一起使用,因为它分配了 256 字节来存储 HA1 值。
示例 1.16. 使用 SHA-256 示例
...
modparam("auth", "algorithm", "SHA-256")
...
3.19. add_authinfo_hdr (boolean)
是否在 200 OK 响应中添加 Authentication-Info 头?Authentication-Info 头提供相互认证。服务器向客户端证明它知道用户的密钥。
该头还包括下一个 nonce,客户端可以在未来的请求中使用。如果启用了 one_time_nonce
,则为下一个 nonce 计算新的 nonce。否则,当前 nonce 用于下一个 nonce。
默认值为 0(否)。
示例 1.17. 添加 Authentication-Info 头示例
...
modparam("auth", "add_authinfo_hdr", yes)
...
4. 函数
4.1. consume_credentials()
此函数从服务器正在处理的消息中删除先前授权的凭据头。这意味着下游消息将不包含此服务器使用的凭据。这确保代理不会向下游元素透露有关使用的凭据的信息,并且消息也会稍微短一些。必须在 www_authorize
、proxy_authorize
、www_authenticate
或 proxy_authenticate
之后调用此函数。
示例 1.18. consume_credentials 示例
...
if (www_authenticate("realm", "subscriber")) {consume_credentials();
}
...
4.2. has_credentials(realm)
如果请求具有带有提供的 realm 的 Authorization 或 Proxy-Authorization 头,则此函数返回 true。参数可以是带有伪变量的字符串。
示例 1.19. consume_credentials 示例
...
if (has_credentials("myrealm")) {...
}
...
4.3. www_challenge(realm, flags)
此函数挑战用户代理。它将生成一个包含摘要挑战的 WWW-Authorize 头字段,将其放入服务器正在处理的请求生成的响应中,并发送 401 回复。收到此类回复后,用户代理应计算凭据并重试请求。有关摘要认证的更多信息,请参见 RFC2617。有关发送回复的模块参数,请参见 force_stateless_reply
。
参数的含义如下:
-
realm - Realm 是一个不透明的字符串,用户代理应将其呈现给用户,以便用户决定使用什么用户名和密码。通常这是服务器运行的主机的域。
它不能是空字符串 “”。对于 REGISTER 请求,可以使用 To 头字段域(例如,变量 $td)(因为此头字段表示正在注册的用户),对于所有其他消息,可以使用 From 头字段域(例如,变量 $fd)。
字符串可以包含伪变量。
-
flags - 此参数的值可以是以下位的组合:
- 1 - 构建带有 qop=auth 的挑战头
- 2 - 构建带有 qop=auth-int 的挑战头
- 4 - 在失败情况下不自动发送 ‘500 Internal Server Error’ 回复(错误代码返回到配置)
- 16 - 构建带有 stale=true 的挑战头
此函数可用于 REQUEST_ROUTE。
示例 1.20. www_challenge 使用示例
...
if (!www_authenticate("$td", "subscriber")) {www_challenge("$td", "1");exit;
}
...
4.4. proxy_challenge(realm, flags)
此函数挑战用户代理。它将生成一个包含摘要挑战的 Proxy-Authorize 头字段,将其放入服务器正在处理的请求生成的响应中,并发送 407 回复。收到此类回复后,用户代理应计算凭据并重试请求。有关摘要认证的更多信息,请参见 RFC2617。有关发送回复的模块参数,请参见 force_stateless_reply
。
参数的含义与 www_challenge(realm, flags)
函数相同。
此函数可用于 REQUEST_ROUTE。
示例 1.21. proxy_challenge 使用示例
...
if (!proxy_authenticate("$fd", "subscriber")) {proxy_challenge("$fd", "1");exit;
}
...
4.5. auth_challenge(realm, flags)
此函数挑战用户代理进行认证。它结合了 www_challenge()
和 proxy_challenge()
函数,通过内部调用第一个函数用于 REGISTER 请求,第二个函数用于其他请求类型。换句话说,它通过发送 401 回复来挑战 REGISTER 请求的认证,并通过发送 407 回复来挑战其他类型的 SIP 请求。
参数的含义与 www_challenge(realm, flags)
函数相同。
此函数可用于 REQUEST_ROUTE。
示例 1.22. auth_challenge 使用示例
...
if (!auth_check("$fd", "subscriber", "1")) {auth_challenge("$fd", "1");exit;
}
...
4.6. pv_www_authenticate(realm, passwd, flags [, method])
此函数根据 RFC2617 验证凭据。如果凭据验证成功,则函数将成功并将凭据标记为已授权(标记的凭据稍后可由其他函数使用)。如果函数由于某种原因无法验证凭据,则它将失败,脚本应调用 www_challenge
,这将再次挑战用户。
负代码可以解释如下:
- -1(通用错误)- 发生了一些通用错误,未发送回复
- -2(无效密码)- 密码错误
- -4(nonce 过期)- nonce 已过期
- -5(无凭据)- 请求不包含具有正确 realm 的 Authorization 头
- -6(nonce 重用)- nonce 已用于认证先前的请求
参数的含义如下:
-
realm - Realm 是一个不透明的字符串,用户代理应将其呈现给用户,以便用户决定使用什么用户名和密码。通常这是服务器运行的主机的域。
它不能是空字符串 “”。对于 REGISTER 请求,可以使用 To 头字段域(例如,变量 $td)(因为此头字段表示正在注册的用户),对于所有其他消息,可以使用 From 头字段域(例如,变量 $fd)。
字符串可以包含伪变量。
-
passwd - 用于认证的密码。可以包含配置变量。用户名取自 Auth 头。
-
flags - 此参数的值可以是以下位的组合:
- 1 - 密码参数的值是 HA1 格式
- 2 - 构建不带 qop 的挑战头并将其添加到 avp
- 4 - 构建带有 qop=auth 的挑战头并将其添加到 avp
- 8 - 构建带有 qop=auth-int 的挑战头并将其添加到 avp
- 16 - 构建带有 stale=true 的挑战头
- 32 - 在认证失败时不使 nc 无效
-
method - 用于认证的方法。此参数是可选的,如果未设置,则为请求行上的第一个 “word”。
当构建挑战头并存储在 avp 中时,可以使用 append_to_reply()
和 sl 回复函数发送适当的 SIP 回复以挑战认证。
此函数可用于 REQUEST_ROUTE。
示例 1.23. pv_www_authenticate 使用示例
...
if (!pv_www_authenticate("$td", "123abc", "0")) {www_challenge("$td", "1");exit;
}
...
4.7. pv_proxy_authenticate(realm, passwd, flags)
此函数根据 RFC2617 验证凭据。如果凭据验证成功,则函数将成功并将凭据标记为已授权(标记的凭据稍后可由其他函数使用)。如果函数由于某种原因无法验证凭据,则它将失败,脚本应调用 proxy_challenge
,这将再次挑战用户。有关负返回代码的更多信息,请参见上述函数。
参数的含义与 pv_www_authenticate(realm, passwd, flags)
相同。
此函数可用于 REQUEST_ROUTE。
示例 1.24. pv_proxy_authenticate 使用示例
...
$avp(password)="xyz";
if (!pv_proxy_authenticate("$fd", "$avp(password)", "0")) {proxy_challenge("$fd", "1");exit;
}
...
4.8. pv_auth_check(realm, passwd, flags, checks)
此函数结合了 pv_www_authenticate
和 pv_proxy_authenticate
的功能,如果 SIP 请求是 REGISTER,则首先执行,否则执行第二个。
前三个参数的含义与 pv_www_authenticate(realm, passwd, flags)
相同。
参数 checks
可用于控制函数的行为。如果为 1,则函数将检查认证用户名是否与 To 或 From 头用户名匹配,无论是否为 REGISTER 请求。参数可以是伪变量。
可能的返回代码集与 pv_{www,proxy}_authenticate
相同,但还有一个可能的值:
- -8(认证用户不匹配)- 认证用户与 From/To 用户不同
此函数可用于 REQUEST_ROUTE。
示例 1.25. pv_auth_check 使用示例
...
$avp(password)="xyz";
if (!pv_auth_check("$fd", "$avp(password)", "0", "1")) {auth_challenge("$fd", "1");exit;
}
...
4.9. auth_get_www_authenticate(realm, flags, pvdest)
构建 WWW-Authentication 头并将结果值设置在 ‘pvdest’ 伪变量参数中。
realm
和 flags
参数的含义与 pv_www_authenticate(realm, passwd, flags)
相同。
此函数可用于 ANY_ROUTE。
示例 1.26. auth_get_www_authenticate
...
if (auth_get_www_authenticate("$fd", "0", "$var(wauth)")) {xlog("www authenticate header is [$var(wauth)]\n");
}
...
4.10. auth_algorithm(algorithm)
设置用于摘要认证的哈希算法,从而覆盖 algorithm
参数。可能的值与 algorithm
参数相同。参数可以是伪变量。
示例 1.27. auth_algorithm 示例
...
auth_algorithm("$alg");
...
相关文章:
kamailio-auth模块详解【以下内容来源于官网,本文只做翻译】
以下是《Auth 模块》文档的中文翻译: Auth 模块 作者:Jan Janak FhG Fokus janiptel.org Juha Heinanen TutPro Inc jhsong.fi Daniel-Constantin Mierla asipto.com micondagmail.com 版权所有 © 2002, 2003 FhG FOKUS 官网链接: https://kamaili…...
从TypeScript到ArkTS的适配指导
文章目录 一、ArkTS语法适配背景程序稳定性程序性能.ets代码兼容性支持与TS/JS的交互方舟运行时兼容TS/JS二、从TypeScript到ArkTS的适配规则概述强制使用静态类型禁止在运行时变更对象布局限制运算符的语义不支持 structural typing约束说明限制使用标准库一、ArkTS语法适配背…...
Git 版本控制:基础介绍与常用操作
目录 Git 的基本概念 Git 安装与配置 Git 常用命令与操作 1. 初始化本地仓库 2. 版本控制工作流程 3. 分支管理 4. 解决冲突 5. 回退和撤销 6. 查看提交日志 前言 在软件开发过程中,开发者常常需要在现有程序的基础上进行修改和扩展。但如果不加以管理&am…...
【Python】理解Python中的协程和生成器:从yield到async
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代编程中,异步编程成为提升程序性能和响应速度的重要手段。Python作为一门功能强大的编程语言,提供了丰富的工具来实现异步操作,其中…...
Unity开发游戏使用XLua的基础
Unity使用Xlua的常用编码方式,做一下记录 1、C#调用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默认在resources文件夹下面//帮助…...
什么是区块链
区块链是一种去中心化的分布式账本技术,它通过一系列复杂而精密的设计原则和机制来确保数据的安全性、透明性和不可篡改性。在最基础的层面上,区块链是由一系列按照时间顺序链接起来的数据块组成的链式结构。每个数据块中包含了一定数量的交易记录或状态…...
C++中的析构器(Destructor)(也称为析构函数)
在C中,析构器(Destructor)也称为析构函数,它是一种特殊的成员函数,用于在对象销毁时进行资源清理工作。以下是关于C析构器的详细介绍: 析构函数的特点 名称与类名相同,但前面有一个波浪号 ~&a…...
【ts + java】古玩系统开发总结
src别名的配置 开发中文件和文件的关系会比较复杂,我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…...
NLP深度学习 DAY5:Sequence-to-sequence 模型详解
Seq2Seq(Sequence-to-Sequence)模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译,但后来广泛应用于其他任务,如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…...
音视频多媒体编解码器基础-codec
如果要从事编解码多媒体的工作,需要准备哪些更为基础的内容,这里帮你总结完。 因为数据类型不同所以编解码算法不同,分为图像、视频和音频三大类;因为流程不同,可以分为编码和解码两部分;因为编码器实现不…...
数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)
一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 2.2.3 结果汇总 …...
【react+redux】 react使用redux相关内容
首先说一下,文章中所提及的内容都是我自己的个人理解,是我理逻辑的时候,自我说服的方式,如果有问题有补充欢迎在评论区指出。 一、场景描述 为什么在react里面要使用redux,我的理解是因为想要使组件之间的通信更便捷…...
nacos 配置管理、 配置热更新、 动态路由
文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...
前端知识速记:节流与防抖
前端知识速记:节流与防抖 什么是防抖? 防抖是一种控制事件触发频率的方法,通常用于处理用户频繁触发事件的场景。防抖的核心思想是将多个连续触发事件合并为一个事件,以减少执行次数。它在以下场景中特别有效: 输入…...
2.攻防世界PHP2及知识点
进入题目页面如下 意思是你能访问这个网站吗? ctrlu、F12查看源码,什么都没有发现 用kali中的dirsearch扫描根目录 命令如下,根据题目提示以及需要查看源码,扫描以php、phps、html为后缀的文件 dirsearch -u http://61.147.17…...
【ubuntu】双系统ubuntu下一键切换到Windows
ubuntu下一键切换到Windows 1.4.1 重启脚本1.4.2 快捷方式1.4.3 移动快捷方式到系统目录 按前文所述文档,开机默认启动ubuntu。Windows切换到Ubuntu直接重启就行了,而Ubuntu切换到Windows稍微有点麻烦。可编辑切换重启到Windows的快捷方式。 1.4.1 重启…...
C#属性和字段(访问修饰符)
不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …...
Androidstdio-真机调试
显示隐藏设备 手机通过数据线插入电脑 Androidstdio设置中下载USB驱动 选择下载的驱动 更新完成后,在编译器查看,此时真机已经显示出来了 调试app可以在日志中查看日志,详细日志查看方法看前面的帖子 如果有这种日志输出,运行到此…...
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
模型设计思路与创新点: 建模的时候应该先确定我们需要建立什么类的模型?优化类还是统计类?这个题需要大量的数据分析,因此我们可以建立一个统计学模型。 统计学建模思路:观察规律,建立模型,参…...
数据结构【链栈】
基于 C 实现链表栈:原理、代码与应用 一、引言 栈就是一个容器,可以当场一个盒子,只能一个一个拿,一个一个放,而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】,所以我们这里只…...
MediaPipe与YOLO已训练模型实现可视化人脸和手势关键点检测
项目首页 - ZiTai_YOLOV11:基于前沿的 MediaPipe 技术与先进的 YOLOv11 预测试模型,精心打造一款强大的实时检测应用。该应用无缝连接摄像头,精准捕捉画面,能即时实现人脸检测、手势识别以及骨骼关键点检测,将检测结果实时、直观地…...
使用 SpringBoot+Thymeleaf 模板引擎进行 Web 开发
目录 一、什么是 Thymeleaf 模板引擎 二、Thymeleaf 模板引擎的 Maven 坐标 三、配置 Thymeleaf 四、访问页面 五、访问静态资源 六、Thymeleaf 使用示例 七、Thymeleaf 常用属性 前言 在现代 Web 开发中,模板引擎被广泛用于将动态内容渲染到静态页面中。Thy…...
pytorch深度Q网络
人工智能例子汇总:AI常见的算法和例子-CSDN博客 DQN 引入了深度神经网络来近似Q函数,解决了传统Q-learning在处理高维状态空间时的瓶颈,尤其是在像 Atari 游戏这样的复杂环境中。DQN的核心思想是使用神经网络 Q(s,a;θ)Q(s, a; \theta)Q(s,…...
list的使用,及部分功能的模拟实现(C++)
目录(文章中"节点"和"结点"是同一个意思) 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…...
makailio-alias_db模块详解
ALIAS_DB 模块 作者 Daniel-Constantin Mierla micondagmail.com Elena-Ramona Modroiu ramonaasipto.com 编辑 Daniel-Constantin Mierla micondagmail.com 版权 © 2005 Voice Sistem SRL © 2008 asipto.com 目录 管理员指南 概述依赖 2.1 Kamailio 模块 2.2 外…...
【AI】DeepSeek 概念/影响/使用/部署
在大年三十那天,不知道你是否留意到,“deepseek”这个词出现在了各大热搜榜单上。这引起了我的关注,出于学习的兴趣,我深入研究了一番,才有了这篇文章的诞生。 概念 那么,什么是DeepSeek?首先百…...
算法随笔_35: 每日温度
上一篇:算法随笔_34: 最后一个单词的长度-CSDN博客 题目描述如下: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升…...
人工智能入门课【手写自注意力机制】
原理 自注意力(Self-Attention)是一种强大的机制,广泛应用于自然语言处理、计算机视觉等领域,尤其是在Transformer架构中发挥了关键作用。它的核心思想是让模型能够动态地关注输入序列中不同位置之间的关系,从而更好地…...
记7(激活函数+多层神经网络+梯度下降法及其优化
目录 1、激活函数1.1、sigmoid函数:2端饱和,下面2个函数都要幂运算,运算速度会比较慢1.2、ReLU函数(Rectified Linear Unit,修正线性单元)1.3、PReLU函数(Parameteric Rectified Linear Unit&am…...
Qt u盘自动升级软件
Qt u盘自动升级软件 Chapter1 Qt u盘自动升级软件u盘自动升级软件思路:step1. 获取U盘 判断U盘名字是否正确, 升级文件是否存在。step2. 升级step3. 升级界面 Chapter2 Qt 嵌入式设备应用程序,通过U盘升级的一种思路Chapter3 在开发板上运行的…...
关于低代码技术架构的思考
我们经常会看到很多低代码系统的技术架构图,而且经常看不懂。是因为技术架构图没有画好,还是因为技术不够先进,有时候往往都不是。 比如下图: 一个开发者,看到的视角往往都是技术层面,你给用户讲React18、M…...
如何使用 ChatBox AI 简化本地模型对话操作
部署模型请看上一篇帖子:本地部署DeepSeek教程(Mac版本)-CSDN博客 使用 ChatBox AI 简化本地模型对话操作: 打开 ChatBox AI 官网:Chatbox AI官网:办公学习的AI好助手,全平台AI客户端…...
缩位求和——蓝桥杯
1.题目描述 在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。 比如:248153720248153720 把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得 24814>145 156 56 而…...
hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题
Hexo 部署博客到 GitHub page 后,可以在 setting 中的 page 中绑定自己的域名,但是我发现更新博客后绑定的域名消失,恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件,内容为 page 里面绑定的域名&…...
neo4j入门
文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品,已经在众多的行业项目中进行了应用,如:网络管理&am…...
代码随想录——回溯
文章目录 组合组合总数电话号码的字母组合组合总数组合总数Ⅱ分割回文串复原IP地址子集子集Ⅱ非递减子序列去重的实现方法方法 1:**排序 跳过重复元素**方法 2:**使用哈希表或数组记录已使用的数字** 去重的完整示例总结本题代码 全排列全排列Ⅱ重新安排…...
独立游戏RPG回顾:高成本
刚看了某纪录片, 内容是rpg项目的回顾。也是这个以钱为核心话题的系列的最后一集。 对这期特别有代入感,因为主角是曾经的同事,曾经在某天晚上听过其项目组的争论。 对其这些年的起伏特别的能体会。 主角是制作人,在访谈中透露这…...
SQLModel入门
目录 概述快速开始官方教程简单使用样例 概述 SQLModel 是一个 ORM 框架,其基于 SQLAlchemy 和 Pydantic,其中 SQLALchemy 提供底层 ORM 能力,Pydantic 提供类型校验能力,SQLModel 中,一个 SQLModel model 既是一个 S…...
关于MySQL InnoDB存储引擎的一些认识
文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的?1.1 MySQL的存储引擎有哪些?1.2 MyIsam和InnoDB有什么区别? 2.MySQL表的结构是什么?2.1 行结构是什么样呢?2.1.1 NULL列表?2.1.2 char和varc…...
【学习笔记】深度学习网络-正则化方法
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…...
NVIDIA (英伟达)的 GPU 产品应用领域
游戏娱乐领域 PC 游戏:NVIDIA 的 GeForce 系列 GPU 是 PC 游戏玩家的首选之一。能实现实时光线追踪、高分辨率渲染等,使游戏画面更加逼真,如《赛博朋克 2077》等支持光线追踪的游戏,在 NVIDIA GPU 的加持下,可呈现出真…...
Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景:你有一大堆珍贵的回忆照片,但又不想使用各种网盘来管理。怎么办?别担心…...
goframe 多语言国际化解决方案
项目背景 本项目采用基于JSON配置的多语言国际化(i18n)解决方案,支持多种语言的无缝切换和本地化。 目录结构 manifest/ └── i18n/├── zh.json # 简体中文├── zh-tw.json # 繁体中文├── en.json # 英语├…...
mysql如何修改密码
在MySQL中修改密码可以通过多种方式完成,具体取决于你的MySQL版本和你是否有足够的权限。以下是一些常用的方法来修改MySQL用户的密码: 方法1: 使用ALTER USER命令 这是最常用的方法,适用于MySQL 5.7及以上版本。 ALTER USER usernameloca…...
17.2 图形绘制8
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.2.10 重绘 先看以下例子: 【例 17.28】【项目:code17-028】绘制填充矩形。 private void button1_Clic…...
Java基础知识总结(三十八)--读取数据
使用Reader体系,读取一个文本文件中的数据。返回 -1 ,标志读到结尾。 import java.io.*; class { public static void main(String[] args) throws IOException { /* 创建可以读取文本文件的流对象,让创建好的流对象和指定的文件相关联。…...
【并查集】
并查集(Disjoint Set Union,DSU)是一种用于处理不相交集合的数据结构,主要支持两种操作:查找(Find)和合并(Union)。它在解决连通性问题、图论问题以及动态连通性等问题时…...
SQL NOW() 函数详解
SQL NOW() 函数详解 引言 在SQL数据库中,NOW() 函数是一个常用的日期和时间函数,用于获取当前的时间戳。本文将详细介绍 NOW() 函数的用法、参数、返回值以及在实际应用中的注意事项。 函数概述 NOW() 函数返回当前的日期和时间,格式为 Y…...
[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率
Paper Card 论文标题:FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者:Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…...
Rust 条件语句
Rust 条件语句 在编程语言中,条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言,其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句,包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...