Captive Portal 认证流程 - 基于 DNS 污染

Captive Portal 认证流程 - 基于 DNS 污染

全局说明

本认证流程基于已有项目扩展。

本认证项目分两部分,分别为:

  1. self-dns 31573 DNS解析、请求转发等
  2. self-auth 31574 用户认证等

以下,用户统称为 client,服务器统称 server,服务地址统称 IP,自定义认证页简称 Portal。

认证流程

首次认证

  1. client 接入 wifi,并通过浏览器访问网站,如访问 baidu.com,
    若此时无网,则 client 设备将主动访问其自身配置的地址验证网络是否可用。
    部分设备验证网络地址见附录1。

  2. server self-dns 启动 UDP:53 端口监听,当其匹配到设备验证网络地址时,
    将请求转发到自定义认证 Portal。

  3. client 通过 Portal 发送认证请求到 self-auth 进行校验,校验成功后开通网络访问

非首次认证

  1. 同首次认证1
  2. 同首次认证2
  3. 同首次认证3
  4. 检查认证记录,若已认证成功,则转发请求到 baidu.com,client 完成请求目标地址

附录

  1. 部分设备验证网络地址
http://connect.rom.miui.com/generate_204
https://connect.rom.miui.com/generate_204
http://connectivitycheck.platform.hicloud.com
http://edge.microsoft.com/captiveportal
http://captive.apple.com/hotspotdetect.html
http://connectivitycheck.android.com
https://captive.v2ex.co
http://clients3.google.com/generate_204
http://connectivitycheck.gstatic.com/generate_204
https://www.google.com/generate_204
ESP32 Captive Portal是一种常见的物联网应用示例,主要用于设置新的设备连接到网络时自动显示一个网页界面,引导用户输入WiFi密码。这是一种简单的接入点配置机制,常用于原型开发、家庭自动化等场景。 在ESP32上实现Captive Portal通常需要以下几个步骤: 1. **硬件准备**:确保ESP32有足够的内存运行Web服务器,并且已经连接到了网络。 2. **固件配置**:使用MicroPython或其他支持HTTP服务器功能的环境,比如Espressif's ESP-IDF框架,配置ESP32作为HTTP服务器。 3. **HTML页面设计**:创建一个简单的HTML页面,包括网络名称、密码输入框以及登录按钮,当设备连接时显示这个页面。 4. **路由器设置**:在路由器设置中开启DHCP服务器,允许ESP32提供IP地址给新设备,并在获取IP后跳转到Captive Portal页面。 5. **代码编写**: - 使用`httpd`库(如uWebSockets)处理HTTP请求,接收来自客户端的POST请求(通常是提交了WiFi密码)。 - 当收到有效密码后,将设备配置到指定的网络,然后关闭Captive Portal,让设备可以访问互联网。 ```python import usocket as socket from http.server import BaseHTTPRequestHandler, HTTPServer class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) # 检查并解析WiFi密码 if 'password' in post_data.decode(): self.send_response(200) self.end_headers() self.wfile.write(b"Access granted!") # 配置设备至目标网络... else: self.send_error(401) def run_captive_portal(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler): server_address = ('', 80) httpd = server_class(server_address, handler_class) print('Starting captive portal...') httpd.serve_forever() run_captive_portal() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

差点GDP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值