问题标签 [drakma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
259 浏览

amazon-web-services - 签名请求和时间戳

亚马逊有一个方便的工具,用于测试请求并确认您正在正确签署请求,他们称之为“便签本”。你给它一个未签名的请求,输入你的身份验证信息,点击提交,它就会吐出一个签名的请求。要么是它,要么是我的代码坏了,逻辑表明这是我的代码,但这没有任何意义。也许这里有人可以看到我看不到的东西。

如果我将暂存器交给一个未签名的请求,例如

http://webservices.amazon.com/onca/xml?AWSAccessKeyId=ME&AssociateTag=ME&Keywords=bbq&Operation=ItemSearch&ResponseGroup=ItemAttributes&SearchIndex=All&Service=AWSECommerceService

我回来

http://webservices.amazon.com/onca/xml?AWSAccessKeyId=ME&AssociateTag=ME&Keywords=bbq&Operation=ItemSearch&ResponseGroup=ItemAttributes&SearchIndex=All&Service=AWSECommerceService&Timestamp=2017-07-16T15%3A14%3A09.000Z&Signature=4oLDpXEdZ%2BEEPBOOPIMAROBOTiALFPPeICbs%3D

如果我向该 URL 发出请求(我从 AMZN 的工具中获得),我得到

Value 2017-07-16T15%3A14%3A09.000Z for parameter Timestamp is invalid. Reason: Must be in ISO8601 format.

如果我手动取消对时间戳进行 url 编码,2017-07-16T15:14:09.000Z那么它似乎已经过去了,只是以可怕的SignatureDoesNotMatch.

如果我使用上面签名 url 中的查询字符串和url 编码的时间戳制作自己的签名消息,则签名匹配!这意味着他们的后端使用 url 编码的时间戳来计算签名,但是我提出的任何带有时间戳的请求,无论是否是 url 编码的,都会给我“那不是 iso8601”错误。%3A所有 url-encoding 所做的只是替代:- 不是一个复杂的过程。

我已经确认正在运行的服务器的语言环境是 utf-8,并且我将application/x-www-form-urlencoded; charset=utf-8其用作请求的内容类型,并确认系统时钟与权威的 ntp 服务器同步。

希望有人以前看过这个或类似的东西。

0 投票
1 回答
207 浏览

sockets - Drakma 和 Dexador 在仅请求本地主机时都在 USocket 调用中失败,请求互联网工作正常

目前对我来说有一个无法解释的行为,感谢任何线索。

背景

我通过 PHP 内置开发 webserver 有一个本地运行的 wordpress 实例php -S localhost:8000 -t /doc/root/wordpress。该网站有效,我可以curl "http://localhost:8000/"成功获取它,我也可以在网络浏览器中打开它。

但简单的程序,如:

或者

——都失败了。

drakma回溯失败:

有趣的是,如果我将 URI 更改为 Internet 上的任何其他 URI:

- 然后它工作正常。

所以问题可能出在我的本地机器和本地 php-server 的上下文中。这些简单的函数调用可能有什么问题?

我的笔记

  • 在回溯中,我看到了这条线(USOCKET:SOCKET-CONNECT "localhost" 8000 :PROTOCOL :STREAM :ELEMENT-TYPE FLEXI-STREAMS:OCTET :TIMEOUT 20 :DEADLINE NIL :NODELAY :IF-SUPPORTED :LOCAL-HOST NIL :LOCAL-PORT NIL)。键:local-host:local-port都是nil。可能这就是问题所在,因为根据usocket 规范,这些参数负责调用bind()本地地址(它与调用非本地地址有什么不同吗?)。

  • 我也没有在规范中找到drakma:http-request任何特殊参数来指定我正在请求本地服务器。根据示例https://edicl.github.io/drakma/#ex-basic-auth,请求任何 URI 都很简单,并且没有任何“本地地址”与非本地的区别。

加起来

  • 为什么请求“ http://localhost:8000 ”不适用于drakmaor dexador。是否有人可以确认本地 Web 服务器的相同行为?

  • bind()对于本地和非本地地址,系统调用是否有所不同?


PS我已经问过类似的问题,首先似乎问题出在旧软件版本上。现在我发现了问题的更多细节并改写了它,所以我在这里提出另一个问题。


更新 1

也许,问题与用于开发的特定 PHP 内置网络服务器有关,因为该问题只能通过 PHP 网络服务器 + SBCL + Drakma 重现。但是 PHP 网络服务器可以很好地用于curlGo 客户端、网络浏览器。

PHP版本:

PHP 7.3.1 (cli) (built: Jan 10 2019 13:16:34) (NTS) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.1,版权所有 (c) 1999-2018,由 Zend Technologies 提供

-- 随brew install php.

重现步骤

服务器:

然后与客户一起尝试:

-- 工作正常(状态码 404 预期并收到)。

语言:

-- 失败(状态码 404 是预期的,但connection refused被返回)。

0 投票
2 回答
90 浏览

common-lisp - drakma:如何为请求传递 JIRA API 令牌?

当我执行以下操作时,传递我的JIRA API 令牌......

...操作成功,我看到其中一个标题是:

我将如何对Drakma做同样的事情?:basic-authorization获取用户名和密码列表。但 JIRA 表示基本身份验证已被弃用。

有没有办法执行 curl 使用的相同编码,并在调用时显式添加标头http-request?提前致谢!

0 投票
1 回答
617 浏览

ssl - CL+SSL SSL 错误:不安全的旧版重新协商已禁用。如何绕过或解决?

我正在尝试使用 common-lisp(sbcl) 访问 https 端点以拉回一些数据。有一段时间,这没有问题。然后有一天我开始收到以下错误

我试过同时使用 drakma 和 dexador,但两者都出现了相同的错误。我已通过 openssl 确认我尝试连接的服务器不支持重新协商。

openssl s_client -connect

我在 OSX 上,我的开放 ssl 版本是 LibreSSL 2.8.3。

因此,据我了解,我的客户正在尝试启动重新协商,但服务器拒绝了它。我真的不知道从哪里开始,在这一点上,我什至不确定问题到底在哪个级别,openSSL、CL+SSL 或构建在 CL+SSL 之上的 http 客户端库。有什么方法可以禁用重新协商或强制建立新连接?我缺少一些设置吗?