opensips实战教程(四): 使用自己的账号系统鉴权
目录
前言
1、OpenSIPS对请求进行鉴权
1.1 SIP鉴权请求过程
2、鉴权模块配置
3、REGISTER注册请求鉴权
4、Proxy代理请求鉴权
前言
注册鉴权和代理鉴权鉴权是RFC3261中规定的,但这不是强制要求的,事实上在实践中很多时候是不用鉴权的,一是鉴权需要耗费时间,二是很多时候已经对IP做了鉴权,所以非法请求基本都会被过滤掉。但鉴权在一些场景下是会用到的。
1、OpenSIPS对请求进行鉴权
OpenSIPS做为一个sip代理服务器,支持客户端注册到OpenSIPS。注册客户端可以呼叫经由OpenSIPS代理转发到其它sip服务器或网关,或者直接呼叫注册在同一个OpenSIPS上的SIP终端。
OpenSIPS数据库使用subscriber表存储自己的账号和密码,如果需要创建账号测试,可以使用脚本创建账号,如:
./opensipsctl add 101 101 # 添加用户101,密码101 |
SIP鉴权请求过程
Sip鉴权主要有两种,一种是Register鉴权,一种是代理鉴权。如下图所示(省略了ACK):
注册鉴权只针对REGISTER请求,代理鉴权则一般会针对REGISTER之外的其他请求。对请求进行鉴权不是必需的,鉴不鉴权取决于业务需要。而在OpenSIPS中,如果需要鉴权,只需在需要鉴权的请求路由脚本中添加ww_authorize()或proxy_authorize()函数即可实现。下面用实例进行说明。
2、鉴权模块配置
通常情况下,我们都不会用opensips库的subscriber表中的账号和密码进行鉴权,而是使用项目业务系统的账号系统进行鉴权。也就是使用业务系统的数据库中的账号密码进行鉴权。如下图配置
loadmodule "auth.so" loadmodule "auth_db.so" modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "password_column", "password") # 鉴权表中密码字段名 modparam("auth_db", "user_column", "clientNumber") # 鉴权表中账号字段名 modparam("auth_db", "db_url", "mysql://root:[email protected]:3306/my_user_db") # 数据库链接设置 |
需要在auth_db模块中配置我们账号系统的数据库地址和用户名,已及用户和密码对应的表字段名。
3、对REGISTER请求鉴权
SIP终端注册到SIP服务器上一般需要鉴权,以验证注册终端的有效性,只允许成功注册上的SIP终端发起呼叫。OpenSIPS中对注册请求使用我们自己的账号体系进行鉴权很简单。如下是路由配置:
route{ ... if (is_method("REGISTER")){ # authenticate the REGISTER requests # auth_db模块中配置的数据库中的用户表 if (!www_authorize("", "tb_extension")){ www_challenge("", "0"); exit; } if (!db_check_to()) { sl_send_reply("403","Forbidden auth ID"); exit; } if (client_nat_test("11")) { fix_contact(); # 修复AOR,解决NAT问题 } ... exit; } ... } |
4、代理请求鉴权
代理鉴权与注册鉴权类似。
route{ ... if (is_method("REGISTER")){ # auth_db模块中配置的数据库中的 # 用户表、字段鉴权 if (!proxy_authorize("", "tb_extension")){ www_challenge("", "0"); exit; } if (!db_check_from()) { sl_send_reply("403","Forbidden auth ID"); exit; } } else { if (!uri==myself) { send_reply("403","Rely forbidden"); exit; } } } ... } |
小结
当OpenSIPS作为注册服务器的时候,这两种鉴权操作是会用到的。首先用户注册上来需要鉴权通过才可以,注册上的用户发起请求也要对请求进行代理鉴权。其他时候可能要求就没有这么严格了。
(全文完)
更多参考官方文档:
http://www.opensips.org/html/docs/modules/2.3.x/auth_db.html