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中会包含下列参数:
参数 | 说明 |
---|---|
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 | 用户的流量限制。如果不下发,则不限制。 |