背景
WebAuthn全称是Web Authentication API,是由W3C和FIDO在 Google、Mozilla、Microsoft、Yubico 等公司的参与下编写的规范。WebAuthn是一组在服务器、浏览器和身份验证器之间启用无密码身份验证技术。一般使用非对称加密技术,用公钥代替传统的密码,来注册和验证用户。主流浏览器Chrome、Firefox、Edge 和 Safari 都支持 WebAuthn。
注册流程
用户进入注册页面,填写个人资料后,提交给服务端。
服务端收到个人资料后,生成Challenge(随机字符串)和凭证 ID(用户的userID)返回给客户端。
客户端将Challenge 、凭证 ID和服务器域名信息发送给验证器(Authenticator),验证器可以是FaceID、实体秘钥等认证设备,存在多个设备可以让用户选择一种验证器。
验证器判断域名+凭证 ID是否存在密钥对,不存在就创建新的密钥对(公私钥)。验证器将私钥存在域名+凭证 ID下,再用私钥签名Challenge,将签名结果、凭证 ID和公钥返回给客户端(浏览器)。
浏览器把结果传给服务器
服务器取出凭证 ID对应的Challenge,用公钥签名Challenge,将结果和浏览器返回的签名比较,一致表面验证通过。然后,把凭证 ID对应的公钥存下来。
认证流程
用户进入登录页面,输入用户名后点击登录
服务器返回凭证 ID(userID)和Challenge
浏览器将域名、凭证 ID(userID)和Challenge发给验证器
验证器通过域名、凭证 ID找到私钥,通过私钥签名Challenge,将签名结果返回给浏览器。
浏览器将将签名结果、凭证 ID发给服务器
服务器取出凭证 ID对应的Challenge,用公钥签名Challenge,将结果和浏览器返回的签名比较,一致表面验证通过,允许用户登录。
引用
接口文档: https://webauthn.guide/