背景
这两个模块用于账号认证的,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