背景
这两个模块用于账号认证的,auth_db
模块必须和auth
模块一起.
auth_db
要使用数据库存储账号信息.
官方文档地址:
本次测试的kamailio版本是:
version: kamailio 5.8.5 (x86_64/linux)
auth 模块
参数解析
|
|
主要函数
consume_credentials()
删除认证信息,比如:删除Authorization
头部,删除Proxy-Authorization
头部.
has_credentials(realm)
检查请求的Authorization
或者Proxy-Authorization
头部是否包含realm
.
www_challenge(realm, flags)
生成WWW-Authenticate
头部给响应并发送401
返回.
- realm: 不能为空,在
REGISTER
请求中,可以用$td
(To domain),其他请求中,可以用$fd
(From domain). - flags: 可以为:
- 1: 构建challenge头,使用
qop=auth
- 2: 构建challenge头,使用
qop=auth-int
- 4: 在一些失败的场景中,不发送
500 Internal Server Error
响应 - 16: 构建challenge头,使用
stale=true
- 1: 构建challenge头,使用
proxy_challenge(realm, flags)
生成Proxy-Authenticate
头部给响应并发送407
返回.参数和www_challenge
一样.
auth_challenge(realm, flags)
是www_challenge()
和proxy_challenge()
的合集.
如果请求是REGISTER
请求,就生成authentication返回401
,其他的请求,返回407
。
pv_www_authenticate(realm, passwd, flags [, method])
验证credentials
是否正确,如果正确,标记此credentials
已经验证了,如果失败,后面可以主动调用www_challenge()
再次请求验证.
-
返回值:
- -1: 通用错误,不发送回复
- -2: 密码错误
- -4:
nonce
过期 - -5: 请求没有包含
realm
的Authorization
头部 - -6:
nonce
已经被用过了
-
flags:
- 1:
password
必须是HA1
格式 - 2: 构建不带
qop
的WWW-Authenticate
头部,并添加到avp变量 - 4: 构建带
qop=auth
的WWW-Authenticate
头部,并添加到avp变量 - 8: 构建带
qop=auth-int
的WWW-Authenticate
头部,并添加到avp变量 - 16: 构建带
stale=true
的WWW-Authenticate
头部 - 32: 身份验证失败时,
nc
不失效
- 1:
pv_proxy_authenticate(realm, passwd, flags)
功能和pv_www_authenticate()
一样,只是验证失败之后,可以调用proxy_challenge
重新验证.
pv_auth_check(realm, passwd, flags, checks)
是pv_www_authenticate
和pv_proxy_authenticate
的合集
auth_get_www_authenticate(realm, flags, pvdest)
构建WWW-Authenticate
头部,设置结果到pvdest
变量.参数和pv_www_authenticate
一致
auth_db 模块
参数解析
|
|
主要函数
www_authenticate(realm, table [, method])
验证credentials
是否正确,如果正确,标记此credentials
已经验证了,如果失败,后面可以主动调用www_challenge()
再次请求验证.
- 返回值:
- -1: 通用错误,不发送回复
- -2: 密码错误
- -3: 用户不存在
- -4:
nonce
过期 - -5: 请求没有包含
realm
的Authorization
头部 - -6:
nonce
已经被用过了 - -8:
From/To/RURI
中的用户和认证的用户不一致
www_authorize(realm, table)
和www_authenticate
功能一样
proxy_authenticate(realm, table)
验证credentials
是否正确,如果正确,标记此credentials
已经验证了,如果失败,后面可以主动调用proxy_challenge()
再次请求验证.
proxy_authorize(realm, table)
和proxy_authenticate
功能一样
auth_check(realm, table, flags)
是www_authenticate
和proxy_authenticate
的合集
is_subscriber(uri, dbtable, flags)
检查uri
是否是subscriber
实战
官方配置
- 官方配置文件:
|
|
官方使用的是auth_check
, 由于数据表subscriber
没有数据, 直接注册坐席会报错
- 输出结果:
sip信令图:
可以看到,当REGISTER
第一次请求时,会返回401
错误,并且WWW-Authenticate
头部包含realm
和nonce
.
软电话收到401
之后,再次请求REGISTER
时,由于subscriber
没有用户,所以还是会返回401
.
表subscriber
的结构为:
新增用户:
|
|
再次注册电话成功:
自定义配置
配置文件:
|
|
使用pv_www_authenticate
在 route(AUTH)
路由中,修改:
|
|
为:
|
|
输出的syslog:
|
|
返回的401 sip图:
可以看到,由于配置参数设置了qop
和algorithm
, 所以返回的WWW-Authenticate
头部包含qop
和algorithm
。
软电话再次REGISTER
的sip信令图:
可以看到,Authorization
头部包含qop
和algorithm
。
这种方式好处就是不用请求数据库,但是密码是存变量里,需要单独维护.
使用pv_proxy_authenticate
|
|
修改为:
|
|
返回407 sip图:
可以看到此时返回的是407
, Proxy-Authenticate
头部包含qop
和algorithm
。
软电话再次REGISTER
的sip信令图:
Proxy-Authorization
头部包含qop
和algorithm
。
总结
- 如果不想用数据库,单独使用
auth
,不过密码需要维护 - 如果想使用数据库,就使用
auth_db
和auth
- 如果想返回
401
,就用pv_www_authenticate
,www_authenticate
和pv_auth_check
- 如果想返回
407
,就用pv_proxy_authenticate
,proxy_authenticate
和auth_check