问题标签 [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.
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 服务器同步。
希望有人以前看过这个或类似的东西。
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 ”不适用于
drakma
ordexador
。是否有人可以确认本地 Web 服务器的相同行为?bind()
对于本地和非本地地址,系统调用是否有所不同?
PS我已经问过类似的问题,首先似乎问题出在旧软件版本上。现在我发现了问题的更多细节并改写了它,所以我在这里提出另一个问题。
更新 1
也许,问题与用于开发的特定 PHP 内置网络服务器有关,因为该问题只能通过 PHP 网络服务器 + SBCL + Drakma 重现。但是 PHP 网络服务器可以很好地用于curl
Go 客户端、网络浏览器。
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
被返回)。
common-lisp - drakma:如何为请求传递 JIRA API 令牌?
当我执行以下操作时,传递我的JIRA API 令牌......
...操作成功,我看到其中一个标题是:
我将如何对Drakma做同样的事情?:basic-authorization
获取用户名和密码列表。但 JIRA 表示基本身份验证已被弃用。
有没有办法执行 curl 使用的相同编码,并在调用时显式添加标头http-request
?提前致谢!
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 客户端库。有什么方法可以禁用重新协商或强制建立新连接?我缺少一些设置吗?