Streamlit付费课程平台:单邮箱单设备登录及IP获取异常问题咨询
我希望每个邮箱仅能在一台设备登录。目前我正在开发一个基于Streamlit(Python API)的课程视频展示网站,希望仅允许付费用户观看视频,但用户通过邮箱登录,存在用户将邮箱共享给他人的风险,请问该如何防范此问题?
我尝试通过以下代码获取客户端IP地址,但IP每两天就会变化,并非固定值(我认为未正确获取到真实IP地址)。
注:Streamlit应用部署在GitHub上,通过Streamlit Cloud运行GitHub中的脚本。WEB = 'https://whatismyip.com/' def get_client_ip(): try: response = requests.get(WEB) if response.status_code == 200: # everythin is good data = response.json() return data.get('ip', 'Unknown') else: return 'Unknown' except requests.exceptions.RequestException: return 'Unknown'
一、修正客户端真实IP获取逻辑
你当前的代码请求第三方网站获取的是Streamlit Cloud服务器的公网IP,并非用户的真实客户端IP,所以会出现IP频繁变化的情况。正确的做法是从Streamlit的请求头中提取由平台转发的真实IP:
import streamlit as st def get_client_ip(): try: # Streamlit Cloud通过X-Forwarded-For头传递客户端真实IP ip = st.request.headers.get('X-Forwarded-For') if ip: # 若存在多个代理IP,取最原始的客户端IP(第一个) ip = ip.split(',')[0].strip() return ip # 备选头,兼容部分代理场景 ip = st.request.headers.get('X-Real-IP') return ip or 'Unknown' except Exception: return 'Unknown'
二、多维度防范邮箱共享方案
仅靠IP绑定无法完全解决问题(家用宽带多为动态IP,同一用户的IP也会变化),建议结合以下多种方式构建防护体系:
设备特征+会话令牌绑定:
除了IP,提取客户端的User-Agent(浏览器/设备型号信息),将邮箱、IP、User-Agent三者关联到登录生成的会话令牌中。用户后续访问时,验证当前设备特征与令牌绑定的信息匹配度,若差异过大则触发二次验证(比如发送邮箱验证码)。限制单账号并发会话:
记录每个邮箱的活跃会话数,只允许1个有效会话存在。当新登录请求触发时,强制注销旧会话,并向原登录设备发送通知邮件,提醒账号可能被共享。定期身份验证:
每隔固定时长(比如2小时)或用户进入视频播放页面时,要求输入邮箱验证码,增加账号共享的操作成本。视频动态水印:
在课程视频中添加包含用户邮箱ID、登录时间的动态水印,即使视频被录屏传播,也能追溯到共享源头,对用户形成威慑。异常行为监控:
监控账号的异常操作,比如短时间内从多个不同IP/设备登录、快速切换大量视频、播放倍速异常等,触发预警后暂停账号权限并人工审核。明确用户协议约束:
在付费环节明确告知用户禁止账号共享,一旦发现违规立即封禁账号且不予退款,从规则层面降低共享动机。
内容的提问来源于stack exchange,提问作者someone_398492

