使用身份验证令牌的 Axios 请求有时会在 Safari 中失败

2024-06-23

我正在开发一个使用 axios (0.19.0) 的 React (16.9.0) 单页应用程序。 axios 请求使用令牌身份验证来访问运行 django-rest-framework (3.6.4) 和 django-cors-headers (3.1.1) 的服务器。身份验证令牌由 django-rest-auth (0.9.5) 在登录期间生成。

该应用程序在 Chrome 和 Firefox 中可靠运行。在 Safari 中,某些请求会因 401 错误而失败。

此请求在所有三个浏览器中均成功:

INFO basehttp: "GET /apis/games/?slug=pop HTTP/1.1" 200 60932```

生成它的代码如下所示:

    axios
      .get(`${simplUrl}/apis/games/?slug=${gameSlug}`, {
        headers: { Authorization: simplToken },
      })
      .then(res => {
        this.setState({
          game: res.data[0],
        });
      ...

此请求在 Safari 中失败:

INFO basehttp: "OPTIONS /apis/runs/43 HTTP/1.1" 200 0
INFO basehttp: "DELETE /apis/runs/43 HTTP/1.1" 301 0
INFO basehttp: "OPTIONS /apis/runs/43/ HTTP/1.1" 200 0
WARNING basehttp: "DELETE /apis/runs/43/ HTTP/1.1" 401 58

但使用 Chrome 成功了:

INFO basehttp: "OPTIONS /apis/runs/43 HTTP/1.1" 200 0
INFO basehttp: "DELETE /apis/runs/43 HTTP/1.1" 301 0
INFO basehttp: "OPTIONS /apis/runs/43/ HTTP/1.1" 200 0
INFO basehttp: "DELETE /apis/runs/43/ HTTP/1.1" 204 0

生成它的代码如下所示:

      const url = `${simplUrl}/apis/runs/${run.id}`;
      // console.log('url:', url);
      axios
        .delete(url, {
          headers: { Authorization: simplToken },
        })
        .then(res => {
          // console.log(res);
          afterDelete();
        });

Safari 401 响应是:

"detail": "Authentication credentials were not provided."

This is the information Safari logged for the failed DELETE request: enter image description here

DRF api 视图的使用基于以下混合:

class CommonViewSet(viewsets.ModelViewSet):
    authentication_classes = (TokenAuthentication, BasicAuthentication, SessionAuthentication)
    permission_classes = (IsAuthenticated,)

对于本地开发,DRF服务器的CORS设置为:

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]

我不明白为什么有些请求在 Safari 中失败,而另一些则不然。大多数情况下,我想确保所有请求在所有三个浏览器中都能正常工作。


解决方案是在引用单个对象的 url 中添加尾部斜杠。这DRF 路由器文档 https://www.django-rest-framework.org/api-guide/routers/表明正确的模式是:

URL pattern: ^users/{pk}/$ Name: 'user-detail'

无论是 bug 还是 Safari 未在重定向请求中包含身份验证令牌而导致 401 错误的功能,我都会留给读者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用身份验证令牌的 Axios 请求有时会在 Safari 中失败 的相关文章

随机推荐

  • AudioSet 和 Tensorflow 理解

    With AudioSet https research google com audioset index html发布并为那些进行合理研究分析的人提供了一个全新的研究领域 最近几天我一直在努力深入研究如何分析和解码这些数据 数据在 tf
  • Rails 3.2.3 - Bundler 找不到 gem“railties”的兼容版本

    我一直在关注 Michael Hartl 的更新版本 Ruby on Rails 教程 http ruby railstutorial org ruby on rails tutorial book fig 3aheroku app 31我
  • 重置 JDBC Kafka 连接器以从头开始提取行?

    Kafka 连接器可以利用主键和时间戳来确定需要处理哪些行 我正在寻找一种重置连接器的方法 以便它从一开始就进行处理 因为要求是在分布式模式下运行 所以最简单的做法是将连接器名称更新为新值 这将提示在 connect offsets 主题中
  • 如何克隆 Angular UI 树中的节点?

    如何克隆 Angular UI 树中所有子节点的节点 现在我使用事件点击 ng click newSubItem this where newSubItem是函数 scope newSubItem function scope var no
  • Xcode 9:如何安装 ios 10 sdk

    鉴于目前 Xcode 9 是测试版 而今天的主要兴趣是了解 iOS 11 这个问题无疑很奇怪 在 Xcode 9 beta 中工作时 有没有办法将 iOS 10 作为基础 sdk Apple 是否需要像在 Xc8 中为以前的操作系统打包 X
  • 如何同时执行 typescript watch 和运行服务器?

    我正在用nodejs开发我的项目 我发现如果我需要编码和测试api 我会运行两个控制台 一个是执行typescript watch 另一个是执行server 我觉得这样太麻烦了我发现 github 上的其他开发人员已经编写了脚本packag
  • 使用神经网络包保存神经网络图时遇到问题 - R

    我正在使用neuralnetR 中的包 但是将绘图保存到磁盘时遇到问题 data iris attach iris library neuralnet nn lt neuralnet as numeric Species Sepal Len
  • flex:1 和 flex-grow:1 的区别

    In mdn https developer mozilla org en US docs Web CSS flex flex 1 意思是一样的 flex grow 1 但实际上它在浏览器中的显示有所不同 你可以在这个尝试一下jsFiddl
  • MVC 2 中不明确的操作方法

    我在 MVC 2 中遇到一些不明确的操作方法问题 我尝试实现此处找到的解决方案 ASP NET MVC 不明确的操作方法 https stackoverflow com questions 1045316 asp net mvc ambig
  • 如何使用 jQuery 获取文本框中输入的文本长度?

    如何使用 jQuery 获取文本框中输入的文本长度 var myLength myTextbox val length
  • 将 __m256 值设置为所有 1 位的最快方法

    如何将值中的所有位设置为 1 m256价值 使用 AVX 或 AVX2 内在函数 要获得全零 您可以使用 mm256 setzero si256 为了获得所有这些 我目前正在使用 mm256 set1 epi64x 1 但我怀疑这比全零情况
  • JSR-310 - 解析可变长度的秒分数

    有没有办法创建 JSR 310 格式化程序 能够解析以下具有可变长度秒分数的日期 时间 2015 05 07 13 20 22 276052 or 2015 05 07 13 20 22 276 示例代码 DateTimeFormatter
  • 生成 k 个成对独立的哈希函数

    我正在尝试实施一个计数最小草图 http en wikipedia org wiki Count Min sketchScala中的算法 所以我需要生成k个成对独立的哈希函数 这是一个比我以前编写过的任何东西都低的级别 除了算法类之外 我对
  • 如何创建关键点来计算 SIFT?

    我正在使用 OpenCV Python 我已经使用确定角点cv2 cornerHarris 输出的类型为dst 我需要计算角点的 SIFT 特征 输入到sift compute 必须是以下类型KeyPoint 我不知道如何使用cv2 Key
  • MY SQL - 错误代码:1010。删除数据库时出错(无法 rmdir;errno:13)

    当尝试删除 MySQL 中的数据库时 DROP DATABASE IF EXISTS temporarydata 我收到以下错误 Error Code 1010 Error dropping database can t rmdir tem
  • 如何通过map[string]interface{}递归迭代

    我遇到了一个问题 如何在附加条件下递归地迭代 map string interface 1 如果一个值是一个映射 递归调用该方法 2 如果一个值是一个数组 调用数组的方法 3 如果一个值不是一个映射 处理它 现在当方法尝试执行时doc th
  • 哪个版本的 SQLite 添加了对 Lead() 和 lag() 函数的支持?

    我正在尝试使用以下查询作为我的 Android SQLite 数据库中更大查询的一部分 但在我看来 我收到的错误表明 Android SQLite 尚不支持 Lead 函数 我尝试查看 sqlite org 上的发布日志 但无法找到何时添加
  • mysqli_real_escape_string - 100% 安全的示例

    我知道已经有人就这个话题提出了很多问题 我也知道要走的路是准备好的陈述 然而 我仍然没有完全理解以下是否或如何可能成为安全问题 mysqli new mysqli localhost root myDatabase mysqli gt se
  • swift 中的延迟函数[重复]

    这个问题在这里已经有答案了 我没有可供采样的代码或任何东西 因为我不知道该怎么做 但是有人可以告诉我如何使用 swift 将函数延迟一定的时间吗 您可以使用 GCD 在示例中延迟 10 秒 Swift 2 let triggerTime I
  • 使用身份验证令牌的 Axios 请求有时会在 Safari 中失败

    我正在开发一个使用 axios 0 19 0 的 React 16 9 0 单页应用程序 axios 请求使用令牌身份验证来访问运行 django rest framework 3 6 4 和 django cors headers 3 1