移动体验 / 方法解读

移动端 Fetch 请求携带 Cookie 失败?检查 credentials 设置

移动端网页发起跨域请求时,若携带凭证却未正确配置响应头,会导致请求失败或数据丢失。

展示在Postman软件界面中,用于添加Cookie伪造请求的设置面板截图。
主题资料配图,非新闻现场照片 · 配图:postman接口测试之:添加cookie伪造请求

检查请求发起时的凭证设置

移动端网页使用 Fetch API 发起跨域请求时,默认情况下不会携带 Cookie 等凭证信息。若需要发送凭证,必须在请求对象中显式设置 credentials 属性。根据网页技术规范,Request.credentials 的值必须设置为 'include',才能让浏览器在跨域请求中携带凭证。如果未进行此设置,服务器将无法接收到用户身份相关的数据,导致接口调用异常。

在移动端开发中,开发者常通过 JavaScript 动态创建请求。请确认代码中是否正确指定了 credentials 选项。若使用 XMLHttpRequest,则需检查是否设置了 withCredentials 属性为 true。若使用 Server-sent events,则需确保 EventSource.withCredentials 被设置为 false,因为该属性默认值即为 false。错误的凭证设置会导致浏览器拦截请求,无法完成数据交互。

检查服务器响应头的配置

服务器端必须正确配置 Access-Control-Allow-Origin 响应头,才能允许携带凭证的跨域请求。当服务器使用通配符(*)作为 Access-Control-Allow-Origin 的值时,无法支持凭证传输。这是因为通配符意味着允许任何来源访问,而凭证传输需要明确指定请求来源。因此,服务器必须将 Access-Control-Allow-Origin 的值设置为具体的源地址,而非通配符。

除了 Access-Control-Allow-Origin,服务器还应返回 Access-Control-Allow-Credentials: true 响应头,以明确告知浏览器允许携带凭证。如果服务器仅配置了通配符 Access-Control-Allow-Origin,即使客户端设置了 credentials: 'include',浏览器也会阻止请求,并在控制台报错。正确的配置是服务器返回具体的源地址,并附带 Access-Control-Allow-Credentials: true。

排查请求与响应的匹配情况

在移动端调试时,可以通过浏览器开发者工具的 Network 面板检查请求和响应的详细信息。首先查看请求的 Initiator 和 Headers 部分,确认 Fetch API 的调用代码中是否正确设置了 credentials: 'include'。接着查看响应的 Headers 部分,检查是否存在 Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials 两个响应头。如果响应头缺失或配置不正确,请求将无法成功携带凭证。

如果请求失败,请检查控制台报错信息。常见的错误提示是“Credential is not supported if the CORS header 'Access-Control-Allow-Origin' is '*'”。这表明服务器使用了通配符 Access-Control-Allow-Origin,导致无法支持凭证。此时需要修改服务器配置,将 Access-Control-Allow-Origin 改为具体的源地址,并确保 Access-Control-Allow-Credentials 为 true。只有当客户端设置与服务器配置匹配时,请求才能正常携带凭证。

验证修复后的请求结果

完成上述配置修改后,重新在移动端页面发起请求,并再次检查 Network 面板。确认请求状态码为 200,且响应头中包含 Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials。同时,检查请求是否携带了 Cookie 等凭证信息。如果请求成功且凭证正常传输,说明配置正确。如果仍然报错,请再次检查客户端的 credentials 设置和服务器端的响应头配置,确保两者完全一致。

验证结果可以通过检查响应内容是否包含预期的数据来判断。如果请求成功且数据正常返回,说明凭证传输问题已解决。如果响应内容为空或报错,请进一步排查网络连接或服务器逻辑。通过对比客户端设置和服务器响应头,可以快速定位并解决跨域请求中凭证传输失败的问题,确保移动端应用的数据交互正常进行。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. Reason: Credential is not supported if the CORS header 'Access-Control-Allow-Origin' is '*' - HTTP | MDN ↗
  2. 配图:postman接口测试之:添加cookie伪造请求 ↗
← 更多移动体验文章返回顶部 ↑