后台登录要求扫码,手机放在另一个房间。打开网页,摄像头调不起来,提示权限被拒绝。

浏览器扫码这件事,卡住的通常不是二维码本身。

网页调摄像头的前提

getUserMedia 只在 HTTPS 或者 localhost 下可用,http 的内网地址一律拒绝,报 NotAllowedError。要么给站点配证书,要么用 localhost 调试。

Chrome 地址栏左边有个摄像头图标,权限被拒过会一直记着,点开改回允许再刷新。

不调摄像头也能扫

手机拍张二维码照片,传到电脑,用网页版解码工具上传识别。jsQR 这类库在 canvas 上取像素,几行就能跑,适合嵌在内部工具里。

截图里的二维码也能解,前提是没被压得太狠,边缘糊了就识别不出来,放大到原始尺寸再试。

识别率低还有个原因:屏幕反光。对着显示器拍,摩尔纹会让解码失败,直接截图比拍照靠谱。

扫码登录的现状

微信网页版早就限制新账号登录,很多号扫码后提示环境异常。企业微信、钉钉的网页版扫码正常,用之前先确认账号类型。

扫码后先看手机上的确认页:显示的是哪个应用、要什么权限。跳转域名跟平时不一致,直接取消。

二维码内容超过几百字,码点会变密,手机镜头差一点就读不出来,长链接先用短链处理。

自己搭一个扫码页

内部系统要扫码登录,前端用 getUserMedia 拿视频流,定时抽帧送进 jsQR,识别到就停掉摄像头。注意识别成功后要停掉 track,不然指示灯一直亮着。

摄像头分辨率别默认拉满,720p 足够,太高反而拖慢解码。对焦慢的老设备,让用户把码放正、离远一点。

识别失败的日志记一下:是权限问题、没有摄像头,还是解码失败,三种情况处理方式完全不同。

安全上的两条线

来源不明的二维码别扫,尤其是群里发的「登录领福利」,扫完可能是在别处完成授权登录。

自己做的扫码页面,二维码里别放敏感参数,用一次性 token,扫完即失效,截图转发也不会被人复用。