SoapClient 尝试获取架构文件时出现 401 身份验证错误

2023-12-22

我的应用程序通常连接到第三方服务器以通过 SOAP/WSDL 获取数据:

$this->soap_client = new SoapClient("https://[the-domain]:443/[path]?wsdl", array(
    'trace'=>1,
    'login'=>$this->username,
    'password'=>$this->password,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE
)

去年一切都很好,但他们最近更新了 WSDL 文件,现在当应用程序尝试连接时我收到以下两个错误:

SoapClient::SoapClient(http://[the-domain]:80/[path]?xsd=1): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized

and

SoapClient::SoapClient(): I/O warning : failed to load external entity "http://[the-domain]:80/[path]?xsd=1"

当我查看 WSDL XML 文件时,有问题的不可加载文件似乎是它尝试导入的文档架构文件 (schemaLocation):(来自 WSDL:)

<types>
<xsd:schema>
<xsd:import namespace="[irrelevant]" schemaLocation="http://[the-domain]:80/[path]?xsd=1"/>
</xsd:schema>
</types>

一段时间以来,我一直在努力反对这个问题,据我所知,问题是以下两件事之一:

  1. 当我在浏览器中加载该架构 URL 时(浏览器身份验证后)302 redirects to a httpsurl(并删除端口声明)。尝试导入架构时,SOAP 调用是否可能不会遵循重定向?
  2. 鉴于错误消息是 401 错误 - 尝试导入架构时 SOAP 调用是否可能未传递凭据?模式文件需要与 WSDL 文件相同的身份验证,但服务器在尝试导入时可能没有将身份验证扩展到模式?

假设这是第二个问题,有什么方法可以强制系统使用不同的架构 URL,而无需下载 WSDL 文件、编辑它并在本地存储/引用它?如果是这样,我可以尝试在 URL 中传递凭据(http://username:password@domain....)?

如果我唯一的想法是创建 WSDL 和 XSD 模式文件的修改副本,那就这样吧,但我很想听听是否有人有任何想法可以让我避免这种情况(因为模式确实会随着时间而改变 -到时间)。


看起来 PHP SoapClient 坚持相同域策略 https://en.wikipedia.org/wiki/Same-origin_policy(包括方案)用于在 WSDL 请求中发送基本身份验证用户名和密码,该请求是为了在 WDSL 方案中导入 xsd 文件而完成的。

因此,如果 WSDL url 有一个https方案和导入有一个http方案中,PHP 不会发送基本身份验证信息,因为请求时连接不再加密http导入 url(这会损害身份验证信息的机密性)。

然而,似乎至少对于某些 PHP 版本(可能在较新的版本中已修复),即使http网址重定向到https一个(在同一域上)。在重定向到具有相同域的安全 URL 之后,PHP 当然可以再次包含给定的基本身份验证信息。

Solution

最后,我发现解决此问题的唯一巧妙方法是让对方更改其 WSDL 内容以导入安全 URL (https1) 与 WDSL url 本身具有相同的方案、域和端口。

解决方法

如果这不适合您,当然您可以随时寻求解决方法,即将 WSDL 以及导入保存为本地文件并参考 WDSLfile而不是URL。当然,这也意味着您必须更改 WSDL 以导入正确的本地文件(而不是httpURL),可能还有其他导入。不幸的是,这是我所知道的在这种情况下的唯一解决方法。


PHP Bug?

我也发现了这个这可能是相关的。

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

SoapClient 尝试获取架构文件时出现 401 身份验证错误 的相关文章

  • WordPress 中的 add_action 函数

    嗯 我正在学习创建一个 WordPress 插件 我下载了一个并阅读了代码 然后我看到了这个 我假设 foo 是它将添加操作的标签 但是 array 到底是做什么的呢 add action foo array foo1 foo2 我在看ht
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • 如何解压 PHP/Lumen/Laravel 的 gzip 请求?

    我收到来自第三方的 gzip 编码文本请求 1mb 所以这是有道理的 我的测试路线 router gt post testgzip function Illuminate Http Request request decompressed
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • Woocommerce 让产品显示在存档页面中

    我正在尝试让所有产品显示在我商店的存档页面中 我想知道他们的id我正在使用我的一个钩子 它在 wp head 上运行并检查 if is product category 我想以某种方式访问 产品的查询并获取它们的 ID if is prod
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • 将“php”作为 shell 脚本执行时的自定义 php.ini 文件

    我在跑php作为 shell 脚本 我不确定 shell脚本 是否正确 该文件以 usr bin php 这很好用 但 MongoDB 类没有正确加载php ini文件 具有extension mongo so 未使用 我该如何使用它tha
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • 如果循环中内存超出,我可以在 for 循环中抛出异常吗?

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何处理 foreach 循环中发生
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • Rails 3 不适用于 Windows 7

    红宝石 1 8 7 宝石1 3 7 导轨 3 0 0 3 0 0 rc 当我写rails v时 错误信息来了 在任何 gem 源中都找不到 gem mysql2 0 runtime gt 尝试运行 捆绑安装 当我运行bundle insta
  • Java正则表达式匹配开始/结束标签导致堆栈溢出

    标准执行情况Java Pattern类使用递归来实现多种形式的正则表达式 例如 某些运算符 交替 这种方法会导致输入字符串超过 相对较小 长度的堆栈溢出问题 该长度甚至可能不超过 1 000 个字符 具体取决于所涉及的正则表达式 一个典型的
  • MS-SQL 按降序对输出进行排序

    我有一个 MS SQL 查询 数据库中有数千行记录 SELECT DISTINCT TOP 7 DATENAME MM mydatetime CAST DAY mydatetime AS VARCHAR 2 as thedate MONTH
  • MASM SEG 运营商

    假设我们正在使用 MASM 6 1 16 位 大数据模型编写汇编代码 并且我们有一个名为 MY VAR 的变量 标签 一个名为 MY SEG 的段和一个名为 MY GROUP 的段组 假设 MY VAR 放置在 MY SEG 中 并且 MY
  • 使用 Powershell 监听按键,但不要等待

    我正在尝试编写一个定期切换大写锁定键的脚本 但我也希望能够切换该脚本 因为它会导致其他功能出现一些问题 例如 alt tab 键 以及滚动任务栏中的窗口以查看预览 到目前为止我的脚本是 outer while true do echo To
  • 如何在 Blazor 中执行客户端 UI 事件

    我刚刚开始使用 Blazor 我已经看到了这个新框架的巨大潜力 不过 我想知道它将如何处理简单的事情 例如将焦点设置在输入控件上 例如 在处理单击事件后 我想将焦点设置到文本输入控件 我是否必须使用 JQuery 来完成类似的事情 或者 B
  • 使用 SQLAlchemy 正确的文件结构以及如何将数据添加到数据库

    我正在尝试构建一个简单的博客平台来学习Python和Flask 我正在使用 SQLAlchemy 连接到 Heroku 和 Flask s3 上托管的 Postgres 数据库 以提供来自 AWS 存储桶的静态文件 我主要是遵循这个 htt
  • google.maps.places 及其自动完成方法未定义

    我正在加载谷歌地图 API https developers google com maps documentation javascript jQuery http jquery com 和这个地理完整 http ubilabs gith
  • 在 Spring 框架下:警告:警告找不到记录器的附加程序(org.springframework.web.context.ContextLoader)

    我花了一整天的时间试图解决 web 应用程序中使用 log4j 时遇到的日志记录问题 无论我做什么 我都无法摆脱以下问题 log4j WARN No appenders could be found for logger org sprin
  • 如何在 python 中正确打印 unicode 字符列表?

    我正在尝试在 python 字符串中搜索表情符号 所以我有 例如 em test U0001f680 print em test test This is a test string if any x in test for x in em
  • 将文本识别为简体中文与繁体中文

    给定一段已知为中文且以 UTF 8 编码的文本块 有没有办法确定它是简体还是繁体 我不知道这是否有效 但我会尝试使用 iconv 来查看它是否能在字符集之间正确转换 并将相同转换的结果与 TRANSLIT 和 IGNORE 进行比较 如果两
  • Opera Unite 和 Node.js 有什么区别?

    两者似乎都允许完全使用 JavaScript 编写应用程序 两者都允许服务器端 JS 和客户端 JS 那么 从技术和编程的角度来看 两者有什么区别呢 Opera Unite 是一种协作技术 它使用 Opera 桌面浏览器内的紧凑型服务器来共
  • 查询矩形集合以查找输入矩形的重叠

    在多维空间中 我有一组矩形 所有矩形都与网格对齐 我宽松地使用 矩形 这个词 在三维空间中 它们将是矩形棱柱 我想查询此集合中与输入矩形重叠的所有矩形 保存矩形集合的最佳数据结构是什么 我会不时地向集合中添加矩形和从集合中删除矩形 但这些操
  • 监听键盘事件而不捕获它们?

    我正在编写一个命令行应用程序 它侦听 X Windows 中的 Control 键释放事件 并在检测到这些事件时向另一个进程发出警报 作为 GNU Linux 的新手 我宁愿避免摸索 GCC 因此我正在寻找基于脚本的解决方案 由于我对 Py
  • 是否可以在运行时更改 AWS Lambda 的日志级别?

    我在 AWS 上运行 lambda 并使用 slf4j 进行日志记录 项目要求的一部分是可以使用环境变量在运行时设置日志级别 但我不确定这是否可能 我使用以下代码 但将 UI 中的环境变量 LOG LEVEL 更改为 DEBUG 对添加到
  • DBMS_XPLAN.DISPLAY_CURSOR 与解释计划(如果不使用 Gather_plan_statistics 提示)

    只是要求澄清两者之间的区别 据我所知 解释计划为您提供了理论的执行计划 而 DBMS XPLAN DISPLAY CURSOR 为您提供actual带有语句执行统计信息的执行计划 EXPLAIN PLAN 将此数据存储在 PLAN TABL
  • Blazor onclick 事件从循环传入计数器

    我目前正在通过 Blazor 中的本地解决方案实现表分页 但遇到了一些困难 麻烦的代码如下 用于渲染网格下方的分页按钮 for int i 0 i lt vm TotalPages i
  • easy_install 安装了各种版本的 python、mac osx

    我在 mac OSX 10 6 机器上有各种版本的 python 其中一些安装了 macports gt python select l Available versions current none python24 python26 p
  • 如何防止命令行参数由 R 解释而不是仅由我的脚本解释?

    我正在使用docopt https github com docopt docopt RR 的实现 我的脚本有一个命令行选项 其缩写形式为 g 当我运行我的脚本时 似乎这个参数首先由 R 解释 然后由我的脚本解释 因此 我因为没有为 GUI
  • SoapClient 尝试获取架构文件时出现 401 身份验证错误

    我的应用程序通常连接到第三方服务器以通过 SOAP WSDL 获取数据 this gt soap client new SoapClient https the domain 443 path wsdl array trace gt 1 l