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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章