问题

目前账号已经登录,uniapp的其他端口均可以访问到数据,唯独skymap.html中的8100会提示未登录。(8100是后端网关gateway端口)

分析:

skymap.html 中遇到未登录提示的问题,通常是由于该文件的请求未带上登录状态的认证信息。一般来说,认证信息(如 Cookie 或 Token)默认会由前端框架(如 UniApp)管理,但如果是独立的 HTML 文件,浏览器的安全策略可能阻止了此文件自动带上认证信息。以下是一些具体的排查和解决方法:

1. 确认 Cookie 的 SameSite 设置

检查服务端的 Set-Cookie 响应头是否将 SameSite 设置为 None,并启用了 Secure(在 HTTPS 下),以确保浏览器在跨域请求时能够发送 Cookie;

Set-Cookie: session_id=your_session_value; SameSite=None; Secure

2. 使用带认证的 Fetch 请求

如果使用 Token 认证,确保在 fetch 请求中手动添加 Authorization 头部。例如:

const token = 'your-token-here'; // 从 UniApp 中提取已登录的 token
const response = await fetch('http://localhost:8100/api/v1/iot/thing/aggregated-geo', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(requestData)
});

3. 通过 HTML 文件加载认证信息

如果 skymap.html 无法直接访问 UniApp 中的已登录信息,尝试以下方法:

  • Tokensession_id 通过 URL 参数传递给 skymap.html,并在 HTML 文件中读取:

    <script>
      const urlParams = new URLSearchParams(window.location.search);
      const token = urlParams.get('token');
      // 在 fetch 请求中使用 token
    </script>
    

4. Nginx 配置或 UniApp 代理设置

确保 Nginx 或其他代理服务器上配置正确,尤其是在需要传递 Cookie 或 Header 时,避免跨域问题导致认证失效。

最终经过考虑,我选择修改后端来实现通过后端修改Spring Cloud Gateway 配置love.security 配置指定了一些公开访问的 URL(permit-all-urls)和忽略权限的 URL(ignore-permission-urls)。

love:
  security:
    permit-all-urls:
      - /api/v1/love/thing/aggregated-geo
    ignore-permission-urls:
      - /api/v1/love/thing/aggregated-geo

直接将skymap.html 需要访问的后端api设置成公开访问并忽略权限。(注意这个需要根据实际场景考虑,因为我这个api不涉及重要隐私数据,故可以这样来实现)。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部