前端切换端口,体系前后端交互就报401错误(未授权)的常见缘故原由 ...

打印 上一主题 下一主题

主题 660|帖子 660|积分 1980

当前端切换端口后,前后端交互出现 401 未授权 错误,通常是由于以下缘故原由:

1. 跨域问题

跨域是最常见的缘故原由。前端端口变化会导致欣赏器认为哀求是跨域的,后端如果未精确配置 CORS,会拒绝哀求。


  • 缘故原由

    • 差别端口被欣赏器视为差别的“源”。
    • 如果后端未设置答应跨域访问,会直接返回 401 Unauthorized。

  • 办理方法
    在后端精确配置 CORS 头,比方:
    1. const cors = require('cors');
    2. app.use(cors({
    3.   origin: ['http://localhost:8080', 'http://localhost:8081'], // 允许的前端地址
    4.   credentials: true, // 允许发送认证信息(如 Cookie)
    5. }));
    复制代码
  • 前端哀求中添加跨域支持
    如果使用 fetch 或 axios,确保设置 credentials:
    1. fetch('http://localhost:3000/api', {
    2.   method: 'POST',
    3.   credentials: 'include', // 包括认证信息
    4. });
    复制代码

2. Cookie 不被发送

如果 Token 或 Session ID 存储在 Cookie 中,前端切换端口后,欣赏器可能不会主动发送 Cookie。


  • 缘故原由

    • Cookie 的默认作用域绑定到特定的域名和端口。
    • Cookie 的 SameSite 属性可能限制跨域发送。

  • 办理方法
    后端设置 Cookie 时,确保精确配置:
    1. res.cookie('token', token, {
    2.   httpOnly: true,
    3.   secure: false, // 如果不是 HTTPS,设置为 false
    4.   sameSite: 'None', // 允许跨域发送
    5. });
    复制代码

3. 前端接口地址错误

切换端口后,前端代码可能没有精确指向后端接口。


  • 缘故原由

    • 前端和后端接口地址不匹配。
    • 硬编码的后端地址仍然指向旧的端口。

  • 办理方法

    • 确保前端配置精确指向后端服务。
    • 使用情况变量动态配置后端地址:
      1. const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';
      复制代码


4. 后端对哀求泉源的校验

有些后端会检查哀求的 Origin 或 Referer,确保只答应来自特定泉源的哀求。端口变化可能导致这些校验失败。


  • 缘故原由

    • 后端只答应 http://localhost:8080,切换到 8081 后被拒绝。

  • 办理方法
    修改后端的泉源校验逻辑,添加新的端口到白名单:
    1. const allowedOrigins = ['http://localhost:8080', 'http://localhost:8081'];
    2. if (!allowedOrigins.includes(req.headers.origin)) {
    3.   return res.status(401).send('Unauthorized');
    4. }
    复制代码

5. Token 绑定策略

后端生成或验证 Token 时,可能绑定了额外的上下文信息(如端口、IP 地址、用户署理等)。端口变化可能导致 Token 校验失败。


  • 缘故原由

    • Token 在生成时绑定了 Origin 或 Host,切换端口导致验证失败。

  • 办理方法

    • 确保后端生成 Token 时不绑定端口等敏感信息。
    • 修改后端 Token 验证逻辑,顺应多端口泉源。


6. 开发情况署理配置问题

如果前端通过 Webpack 等工具的署理服务器转发哀求,切换端口后,署理配置可能不匹配,导致哀求未能精确转发到后端。


  • 缘故原由

    • Webpack 的 proxy 配置未包罗新端口。
    • 大概署理配置未生效。

  • 办理方法
    修改 Webpack 配置文件,确保署理精确设置:
    1. module.exports = {
    2.   devServer: {
    3.     proxy: {
    4.       '/api': {
    5.         target: 'http://localhost:3000',
    6.         changeOrigin: true,
    7.       },
    8.     },
    9.   },
    10. };
    复制代码

7. 缓存问题

欣赏器可能缓存了旧端口的哀求信息或错误响应。


  • 缘故原由

    • 欣赏器缓存了 401 错误或旧的跨域配置。

  • 办理方法

    • 扫除欣赏器缓存。
    • 强制刷新页面(Ctrl + Shift + R)。


8. Session 失效或不一致

如果后端通过 Session 验证用户身份,切换端口可能导致 Session 不一致。


  • 缘故原由

    • Session ID 存储在 Cookie 中,切换端口后 Cookie 不再发送。
    • 大概前后端 Session 存储不一致。

  • 办理方法

    • 确保 Session Cookie 设置支持跨域:
      1. app.use(session({
      2.   cookie: { sameSite: 'None', secure: false },
      3. }));
      复制代码
    • 检查后端是否精确验证 Session ID。


9. CSRF 防护机制

某些后端启用了 CSRF 防护,端口变化可能被认为是跨域哀求,导致防护机制拒绝哀求。


  • 缘故原由

    • CSRF Token 校验失败,后端返回 401 Unauthorized。

  • 办理方法

    • 确保前端发送精确的 CSRF Token。
    • 如果是开发情况,可以暂时关闭 CSRF 防护。


综合调试步骤


  • 检查跨域问题

    • 确认后端是否精确配置了 CORS。
    • 检查前端哀求是否携带 Origin 和认证信息。

  • 检查 Cookie 或 Token

    • 是否精确发送了认证信息。
    • 后端是否校验了不匹配的 Origin。

  • 查看后端日记

    • 确认 401 错误的详细缘故原由(如泉源校验失败或 Token 校验失败)。

  • 清除开发情况配置问题

    • 检查 Webpack 署理或本地开发情况设置。

通过以上步骤可以定位和办理 401 错误问题。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------当前端从 8080 换到 8081 后,出现 401 错误 而无法生成 Token,可能是由于以下缘故原由:

1. 跨域问题



  • 缘故原由: 换端口后,欣赏器视为差别的源,跨域访问后端时,若后端未精确设置 CORS,则会报 401 Unauthorized。
  • 验证方式:

    • 检查后端是否返回了跨域错误。
    • 在欣赏器开发者工具 Network 面板,查看哀求是否包罗精确的跨域头。

办理方法:


  • 在后端答应新端口的跨域访问。比方,使用 Express:
    1. const cors = require('cors');
    2. app.use(cors({
    3.   origin: ['http://localhost:8080', 'http://localhost:8081'], // 允许的端口
    4.   credentials: true, // 允许发送 Cookie
    5. }));
    复制代码
  • 如果哀求须要带上 Cookie,确保前端在哀求中添加 credentials:
    1. fetch('http://localhost:3000/api', {
    2.   method: 'POST',
    3.   credentials: 'include', // 确保发送 Cookie
    4. });
    复制代码

2. Token 存储与验证绑定



  • 缘故原由:

    • 如果后端通过 Cookie 通报 Token,而 Cookie 默认只绑定到特定的域和端口,换端口后,欣赏器不会发送旧的 Cookie。
    • 大概后端验证 Token 时,对哀求的 Origin 或 Referer 进行了限制,新端口不被承认。

验证方式:


  • 检查后端是否有雷同的验证逻辑:
    1. if (!allowedOrigins.includes(req.headers.origin)) {
    2.   return res.status(401).send('Unauthorized');
    3. }
    复制代码
办理方法:

  • 修改 Cookie 的设置,答应跨域:
    1. res.cookie('token', token, {
    2.   httpOnly: true,
    3.   secure: false,        // 如果在开发环境,设为 false
    4.   sameSite: 'None',     // 允许跨域
    5. });
    复制代码
  • 检查后端是否对 Origin 有限制,添加新端口的白名单。

3. 前端与后端接口地址不匹配



  • 缘故原由:

    • 前端可能未精确指向后端接口地址。
    • 如果后端接口是绑定到 http://localhost:8080,但前端实验从 8081 访问,后端可能会拒绝哀求。

验证方式:


  • 检查前端代码中后端地址是否精确。
  • 检查后端日记是否记录了哀求。
办理方法:


  • 使用情况变量动态设置 API 地址,制止硬编码:
    1. const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';
    复制代码

4. 后端对端口依赖的逻辑



  • 缘故原由:

    • 后端可能对生成或验证 Token 的逻辑依赖于特定的端口。
    • 比方,通过 req.headers.origin 或 req.headers.host 检查泉源。

验证方式:


  • 查看后端代码,检查 Token 生成逻辑是否绑定到端口或域名。
办理方法:


  • 修改后端逻辑,去掉对端口的硬绑定。比方:
    1. if (!req.headers.origin.startsWith('http://localhost')) {
    2.   return res.status(401).send('Unauthorized');
    3. }
    复制代码

5. 欣赏器缓存问题



  • 缘故原由:

    • 欣赏器可能缓存了旧端口的哀求结果(包罗 401 响应)。
    • 换端口后,缓存的错误响应可能影响哀求。

验证方式:


  • 打开欣赏器开发者工具,扫除缓存后重试。
办理方法:


  • 强制刷新页面或扫除欣赏器缓存。

6. 开发情况配置冲突



  • 缘故原由:

    • 如果前端使用 Webpack 开发服务器(如 webpack-dev-server),它可能须要额外的跨域署理配置。
    • 没有精确配置时,可能导致哀求失败。

办理方法:


  • 在 webpack.config.js 中添加署理:
    1. devServer: {
    2.   proxy: {
    3.     '/api': {
    4.       target: 'http://localhost:3000', // 后端地址
    5.       changeOrigin: true,             // 避免跨域问题
    6.     },
    7.   },
    8. },
    复制代码

综合调试步骤


  • 检查 CORS 配置: 后端是否答应从 8081 访问。
  • 检查 Cookie 设置: 确保 SameSite 和 Secure 参数配置精确。
  • 确认哀求地址: 确保前端代码哀求的是精确的后端地址。
  • 查看后端日记: 确认是否由于 Origin 或其他校验导致哀求被拒绝。
  • 排查开发情况署理: 确保 Webpack 或其他开发工具的署理配置精确。
通过这些步骤,可以定位和办理换端口后报 401 的问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表