如何在Express(Node.js)中使用URL编码处理HTTP Basic Auth

时间:2017-01-18 20:30:43

标签: node.js express basic-authentication url-encoding http-basic-authentication

我正在接收来自我们正在使用的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,但在这种情况下它没有帮助(仅使浏览器提示输入用户名/密码,但不会影响回调)。

1 个答案:

答案 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更轻松地处理授权请求。