OAuth 2.0 授权码流程是什么?扫码登录如何设计?
先理解原理和示例,再练习完整口述与追问。
回答要点
OAuth 2.0 是授权协议:客户端带 client_id、redirect_uri、scope、state 和 PKCE 的 code_challenge 跳到授权服务器,用户同意后回调带 code,后端用 code 加凭证换取 access token。state 防 CSRF,PKCE 防授权码被截获。扫码登录:PC 申请一次性二维码票据并轮询状态,已登录的手机扫码确认后,PC 用票据换取自己的会话。
原理拆解
OAuth 涉及资源所有者(用户)、客户端(你的应用)、授权服务器和资源服务器。授权码流程中,授权码通过浏览器重定向传递,可能被截获,但换令牌需要客户端密钥或 PKCE 的 code_verifier,令牌不经过地址栏。隐式流程已不推荐,OAuth 2.1 草案要求所有客户端使用授权码加 PKCE。OAuth 本身只解决授权,OpenID Connect 在其上增加 ID Token,用于证明用户身份。微信网页授权就是类 OAuth 流程。
扫码登录的票据与 PC 会话绑定,短期有效、一次性使用。状态依次为:待扫码 → 已扫码待确认 → 已确认 → 已过期或已取消。PC 通过轮询、SSE 或 WebSocket 获取状态;手机端展示登录设备、地点,让用户明确确认。
示例与推演
PC 请求 /qr/ticket 得到 ticketId 和过期时间 → 页面展示二维码 → 手机 App 扫码调用 /qr/scan → 页面显示“请在手机上确认” → 手机确认调用 /qr/confirm,服务端把票据绑定用户 → PC 查询到 confirmed,调用 /qr/exchange 获得会话 Cookie → 票据立即作废。
易错点
回调页必须校验 state 与发起时一致;不要把 client_secret 放到前端;扫码登录需防“二维码钓鱼”,确认页要清楚显示即将登录的网站与设备,轮询也要限流。
参考回答可直接练习口述
OAuth 授权码流程是先跳到授权服务器,带上 client_id、回调地址、scope、随机 state 和 PKCE challenge;用户同意后回调拿到 code,再由后端用 code 加密钥或 verifier 换令牌,state 防 CSRF,PKCE 防 code 被截获。OAuth 是授权,要身份认证用 OIDC。扫码登录是 PC 先拿一次性短期票据生成二维码并轮询,手机已登录用户扫码后确认,服务端把票据绑定用户,PC 用票据换自己的会话,票据随即作废。