我正在接收来自我们正在使用的API(Adobe Sign API)的回调。验证这些回调的唯一方法是HTTP Basic Auth,使用URL encoding( 不是标题 )。
文档:
callbackInfo(字符串,可选):每次有新的协议事件时Adobe Sign将执行HTTP GET操作的公共可访问URL。使用标准嵌入式语法支持HTTP身份验证 - 即http://username:password@your.server.com/path/to/file。
如何访问网址的username:password@
部分,以验证凭据?它似乎无法从Request对象中获取(我将整个对象转储到console.error()
并且无法在其中的任何位置找到凭据)。 :(
我使用的是Express 4.14.0,npm 3.10.8& Node.js 7.0.0(如果有帮助,我可以升级到更新版本。)
不幸的是,Adobe Sign支持根本没用。
编辑: 我已经支持HTTP基本身份验证标头(Authorization
)了,但又一次未提供< / strong>在此回调中。使用标题的请求会在我的nginx访问日志中显示用户名,但回调不会显示任何用户名(这是有道理的,因为标题不在那里)。唯一可用的凭据位于URL的username:password@
部分。我甚至不知道这是可能的,but apparently it's part of the URL RFC,今天仍然支持(参见3.1. Common Internet Scheme Syntax
部分)。我真的只收到一个没有标题的简单GET请求。类似于https://adobesign:verysecurepassword@myservice.com/callbacks。
对于失败的身份验证,我返回401
响应并将WWW-Authenticate
标头设置为Basic
,但在这种情况下它没有帮助(仅使浏览器提示输入用户名/密码,但不会影响回调)。
答案 0 :(得分:2)
这是URL RFC的一部分,因为在URL中可以定义用户名和密码,但是由发送它的协议决定。 HTTP不支持您所描述的内容,它只通过Authorization
标头发送HTTP身份验证。还有其他东西被打破了,或许有些东西在它到达你之前剥离了标题,也许Adobe Sign正在发送一些意想不到的东西等等。但是除了标题之外,HTTP没有机制来传输该用户名/密码。它只是不在协议中。
另外,您说您将整个请求转储到控制台,尝试使用console.log(req.get('Authorization'));
转储auth标头您可能没有在控制台中看到用户名/密码值,因为它结合了冒号和base64编码之前发送,因此您将无法在控制台中看到纯文本。
您可能还希望https://github.com/expressjs/basic-auth-connect更轻松地处理授权请求。