未认证授权的服务是网页原因还是
```html 昨天帮朋友看一个后台系统,点进某个功能页,证授浏览器直接弹出一行红字:“未认证授权的服务服务”。他一口咬定是原因前端页面写错了,说“网页都打不开,未认网页肯定是证授你们前端的问题”。我没吭声,服务打开开发者工具,原因Network 面板里一个 这个锅,证授网页不背。服务 “未认证授权的原因服务”这个提示,十有八九是未认网页后端接口返回的。前端页面只是证授个传话筒——它把请求发给服务器,服务器说“你没带令牌”或者“令牌过期了”,服务然后前端把这个错误信息渲染出来。你看到的红字,其实是后端在说话。当然,也有极小概率是前端压根没把 token 塞进请求头里,但那种情况通常连提示都看不到,直接就是白屏或者控制台报错。 我见过不少团队一出这种问题就互相甩锅。前端说后端接口挂了,后端说前端没传参数。其实抓个包就清楚了。打开 Chrome DevTools,切到 Network,刷新页面,找到那个红色的请求,点进去看 Headers。如果 上个月遇到一个更隐蔽的。前端明明传了 token,后端也收到了,但就是返回“未认证授权的服务”。查了半天,发现是 token 里带的 那怎么快速定位?我的习惯是分三步。第一步,看请求有没有发出去。Network 里如果没有这个请求,那就是前端代码逻辑问题——可能按钮没绑定事件,或者路由守卫直接跳转了。第二步,看请求头里有没有 还有一种情况容易被忽略:跨域。前端在 说回我朋友那个系统。我让他把 Network 里的请求头截图发我。果然, 所以下次再看到“未认证授权的服务”,别急着骂前端。打开开发者工具,看一眼请求头,比吵十分钟架管用。认证这事儿,链条很长,锅不能只让网页背。未认证授权的服务是网页原因还是
401 Unauthorized 静静躺在那儿。未认网页Authorization 字段是空的,或者压根没有,那就是前端漏了。如果 Authorization 有值但服务器还是返回 401,那可能是 token 过期、签名不对、或者后端验证逻辑有 bug。还有一种情况:网关层(比如 Nginx、Kong)直接拦截了,请求根本没到业务后端。这时候你看后端日志,干干净净,啥也没有。问题出在网关的认证配置上。aud(受众)字段和网关配置不匹配。网关要求 aud 必须是 api.example.com,但前端拿到的 token 里写的是 web.example.com。这种错,前端看不出来,后端也委屈——它只是照章办事。“未认证授权的服务”从来不是一个前端渲染问题,它是一个认证链路问题。链路上一共有四个环节:前端取 token、前端传 token、网关验 token、后端验 token。任何一个环节掉链子,都会出现这个提示。
Authorization。没有的话,查前端存储 token 的地方,localStorage、sessionStorage、cookie,是不是取的时候 key 写错了。第三步,如果请求头有 token,拿这个 token 去 jwt.io 解码,看 exp 过期时间,看 iss 签发者,看 aud 受众。然后对比后端或网关的配置。八成能揪出问题。localhost:3000,后端在 api.example.com。预检请求 OPTIONS 返回 200,但实际请求返回 401。这时候你看 Network 面板,会发现有两个请求——一个 OPTIONS,一个 GET。OPTIONS 通过了,GET 挂了。问题不在跨域配置,而在认证。但很多人一看到跨域就以为是 CORS 没配好,白白浪费时间。
Authorization 字段是 Bearer undefined。前端从 localStorage 取 token 的时候,key 写成了 access_token,但实际存进去的 key 是 token。改了一个单词,问题解决。网页从头到尾没毛病,它只是忠实地转达了后端的拒绝。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-