用户工具

站点工具


develop:webportal

Web Portal功能开发说明

Web Portal提供了一种网页验证用户登录的机制。

目前常用的开源实现有wifidog、nodogsplash、nocatsplash等,这些实现大多在应用层开发的。

SuperWRT的Web Portal功能为完全新开发的,主要功能都在内核层实现,以保证更完善的体验及效率。

原理

Web Portal主要依靠HTTP的302重定向功能实现。

SuperWRT的Web Portal功能实现的时序图如下所示:

这里,主要通过HTTP的302重定向,将用户所有网页请求,重定向到登录页面。用户的其它报文则拦截不允许通过,但这里有两种数据是放行,一种是DHCP请求,一种是DNS请求。放行DHCP请求,以保证用户可以获取到IP地址。放行DNS请求,以保证用户浏览器会去请求TCP连接。当用户TCP连接HTTP服务时,会被强制DNAT到本地的Web服务,然后返回HTTP的302重定向。

在重定向的连接中,Web Portal设备会加入:用户原HTTP请求地址,用户的设备信息,设备自身的信息。然后,通过重定向跳转,就可以将这些信息带给Web服务器。

Web服务器可以以各种方式来验证用户,如:广告等待,用户名密码方式登录,手机短信验证登录,LDAP方式验证,第三方登录验证(如:QQ,微博),微信公众号关注等。这些验证方式与其它流程无关,仅需要Web服务独立即可完成。

Web服务器验证用户成功后,向Portal服务器请求一个重定向URL,当然,此时需要Web服务器将之前设备传递来的信息也同时发送给Portal服务器。Portal将生成的URL返回给Web服务器,然后,Web服务器可以通过302方式,或网页中跳转方式,或者ajax方式,向Web Portal设备提交放行请求。

为了安全,Web Portal设备会向Portal服务器验证用户请求的合法性。如果请求合法,Web Portal设备就会放行用户。

放行用户时,会根据网页的配置,跳转用户原访问的网页,或跳转希望用户看到的网页。

为了使Web Portal可扩展更多功能,在用户上线及用户下线时,Web Portal设备都会上报通知到Portal服务器。此时,Portal服务器可以返回一些操作给Web Portal设备。

协议格式说明

"用户上线通知" 消息格式

当有新用户上线时,设备会主动向opwifi发送时间消息。如:

"date": "2016-07-21 14:30:02",
"uptime": 56922,
"mac": "00:01:02:03:04:05",
"events": [
    {
      "event": "user online",
      "info": {
        "mac": "12:02:02:03:04:05",
        "indev": "wlan1",
        "ssid": "superwrt_guest",
        "bssid": "00:01:02:03:04:05"
        }
    }
  ]
}

如果需要对用户进行放行,可下发cmd.users指令,可参考"通过重定向的放行请求" 实现原理

"用户下线通知" 消息格式

当用户通过网页注销或超时注销时,设备会向opwifi发送用户下线事件。如:

"date": "2016-07-21 15:52:13",
"uptime": 58523,
"mac": "00:01:02:03:04:05",
"events": [
    {
      "event": "user offline",
      "info": {
        "mac": "12:02:02:03:04:05",
        "indev": "wlan1",
        "ssid": "superwrt_guest",
        "bssid": "00:01:02:03:04:05",
        "authed": true,
        "online": 4203,
        "tx_used": 783228,
        "rx_used": 196530
        }
    }
  ]
}

"HTTP 302重定向" 链接格式

在未通过认证时,用户访问题请求,会被设备重定向。在http中会包含下列参数:

参数 说明
mac 网关设备的MAC地址
gatewayip 网关设备的IP地址
usermac 用户设备的MAC地址
userif 用户所在的接口
ssid 如果用户是无线用户会增加该参数,表示用户所在的ssid
bssid 如果用户是无线用户会增加该参数,表示用户所在的bssid
redir 用户原来访问的地址
md5 URL重定向地址和参数,以及设备中配置的密码一起算出的md5值,用于验证重定向的合法性。

比如:webportal的认证地址为http://superwrt.com/eg/webp,用户访问http://baidu.com,会返回下面的HTTP 302内容。

HTTP/1.1 302 Found
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache,no-store,must-revalidate,max-age=0
Connection: close
Content-Length: 0
Location: http://superwrt.com/eg/webp?mac=00%3A01%3A02%3A03%3A04%3A05&gatewayip=192.168.17.1&usermac=12%3A02%3A02%3A03%3A04%3A05&userif=wlan1&ssid=superwrt_guest&bssid=00%3A01%3A02%3A03%3A04%3A05&redir=http%3A%2F%2Fbaidu.com

如果使用了js跳转方式(默认打开),会先重定向到设备的81端口,然后再通过js跳转到认证地址。

"登录成功,重定向网页" 链接格式

用户通过opwifi认证成功后,会将用户的网页重定向到设备的网页地址,用于与认证进行验证。

如:

http://oplogin.com/api/webp/1/confirm?mac=00%3A01%3A02%3A03%3A04%3A05&usermac=12%3A02%3A02%3A03%3A04%3A05&token=FD3513DE763fdsa79213gbsaWF

"通过重定向的放行请求" 实现原理

当用户网页被重定向到http://oplogin.com/api/webp/1/confirm这个地址后,将请求设备的相应URL(因为oplogin.com的IP地址为设备)。

当设备收到这个请求后,会将该请求中的参数转发给opwifi进行验证,请求内空如下:

{
"date": "2016-07-21 14:32:12",
"uptime": 57052,
"mac": "00:01:02:03:04:05",
"confirm": {
  "args": {
    "mac": "00:01:02:03:04:05",
    "usermac": "12:02:02:03:04:05",
    "token": "FD3513DE763fdsa79213gbsaWF"
    },
  "post": false,
  "usermac": "12:02:02:03:04:05"
  }
}

上面请求内容的含义:

节点 说明
confirm.args 用户请求的URL中的参数
confirm.post 用户的请求是否为POST请求
confirm.usermac 设备获取到的请求来源对应的MAC地址

对于上面的请求,如果在opwifi中验证成功后,会返回给设备如下内容:

{
"cmd": {
  "users": [
      {
        "mac": "12:02:02:03:04:05",
        "permit": true,
        "name": "xxxx",
        "force_timeout": 7200,
        "tx_rate": 524288,
        "rx_rate": 1048576,
        "trx_limit": 268435456
      }
    ]
  },
"confirm": {
  "url": "http://superwrt.com/eg/webp_succ"
  }
}

上面返回内容的含义:

节点 说明
confirm.url 用户302重定向的地址
cmd.users.0.mac 指令针对用户设备的MAC地址
cmd.users.0.permit 是否允许通过
cmd.users.0.name 用户标示,用于在设备中查看使用
cmd.users.0.force_timeout 认证的强制超时时间。如果不下发,则使用webportal的全局配置
cmd.users.0.tx_rate 用户的发送速率限制。如果不下发,则使用系统配置。
cmd.users.0.rx_rate 用户的接收速率限制。如果不下发,则使用系统配置。
cmd.users.0.trx_limit 用户的流量限制。如果不下发,则不限制。

常见问题

develop/webportal.txt · 最后更改: 2016/07/29 09:47 由 terra