WWW-Authenticate 是什么
WWW-Authenticate 是 401 Unauthorized 响应必须携带的挑战头:服务器用它告诉客户端「这里需要认证,支持哪些方案,参数长什么样」。客户端据此决定是弹浏览器认证框、跳转登录页,还是用已有的令牌重试。调试 401 时,第一件事就是看这个头,因为它能区分「压根没带凭证」「凭证过期」「权限不足」等不同原因,而状态码本身只说了一个大概。
基本信息
| 名称 | WWW-Authenticate |
|---|---|
| 作用 | 发起认证挑战,声明方案与参数 |
| 规范 | RFC 9110 §11.6.1;Basic RFC 7617;Bearer RFC 6750;Digest RFC 7616 |
| 常见方案 | Basic、Bearer、Digest |
| 多方案 | 可并列多个挑战,客户端选自己能支持的 |
| 代理对应 | 407 响应用 Proxy-Authenticate |
典型使用场景
- 实现 OAuth2/Bearer 接口:401 时返回带 error 描述的标准挑战
- 排查客户端不弹认证框:检查挑战头的方案是否被客户端支持
- 设计内网服务:Basic 挑战配合 TLS 提供最简单的账号密码保护
- 多方案并存:同时给出 Bearer 与 Basic,让不同客户端各取所需
- 网关统一鉴权:由网关返回 401 并被后端应用正确透传
常见挑战示例
常见挑战示例
# Bearer 挑战(令牌过期)
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="api", error="invalid_token", error_description="token expired"
# Basic 挑战(浏览器会弹出认证框)
WWW-Authenticate: Basic realm="admin", charset="UTF-8"
# 携带凭证重试
curl -si -H 'Authorization: Bearer <token>' https://api.example.com/me | head -1常见方案参数
| 方案 | 关键参数 | 说明 |
|---|---|---|
| Basic | realm、charset | 账号密码经 Base64,必须跑在 TLS 上 |
| Bearer | realm、error、error_description、scope | OAuth2 令牌,error 帮客户端区分失败原因 |
| Digest | realm、nonce、qop、algorithm | 挑战应答式,较少见于新系统 |
| 多方案 | 逗号分隔多个挑战 | 客户端选支持且强度更高者 |
| scope | 权限范围 | 令牌权限不足时可提示需要哪些范围 |
客户端自动跳登录、弹认证框的行为都由这个头驱动。同一路径收到 401 但客户端毫无反应,常见原因是响应体里直接写了 JSON 错误页却漏了 WWW-Authenticate,或者被网关改写掉了。
Basic 方案的凭据只是 Base64 编码而非加密,明文传输等于把账号密码直接交给中间人。除非整条链路强制 TLS,否则不要在生产环境使用 Basic,且确需使用时应校验并限制 realm 与字符集。