在URL中指定username:password格式时,Twilio不会在标头中发送信用

时间:2016-01-19 22:47:40

标签: node.js authentication twilio basic-authentication digest

我正在开发我的应用程序,我正处于可以开始测试来自Twilio的消息的阶段。我使用面向公众的IP地址在数字海洋上配置我的服务器,我的Nodejs应用程序正在收听来自Twilio的呼叫。 我还配置了我的电话号码消息"请求网址"到" http://username:password@198.xxx.xxx.xxx/messages"使用" HTTP POST"。

当我调试标题时,我没有看到"授权"头。我在这里遗漏了什么? 任何帮助深表感谢! 以下是代码。



var headerValues = bag.req.headers.authorization.split(' ');

  console.log(bag.req.headers);

  var scheme = headerValues[0];
  if (scheme === 'Basic') {
    var credentials = headerValues[1];
    var decoded = new Buffer(credentials, 'base64').toString().split(':');
    bag.req.creds = {
      userName: decoded[0],
      password: decoded[1],
      authType: 'basic'
    }
  }




2 个答案:

答案 0 :(得分:0)

我使用与我建立的几个呼叫中心相同的设置。

如果您在IP地址之前使用需要用户名:password @的代理设置,那么如果您可以通过直接访问实际的服务器IP地址来访问代码,则可能会出现问题,如下所述。但是,你没有提到使用代理只是使用数字海洋液滴,所以我在回答假设您没有代理设置。

因此,如果您确实有代理设置,请确保您可以先直接访问服务器的IP地址。

此外,如果这些只是您需要传递的额外变量,最好在IP地址后附加它们

例如xxx.xxx.xxx.xxx/username/password

然后用req.params

获取它们 例如

(是的,这将适用于帖子数据,因为它只是URL的一部分而不是实际的get命令帖子)

init.php

首先,您不希望将请求网址指向" http://username:password@198.xxx.xxx.xxx/messages"使用" HTTP POST"。

如果您没有针对您的IP地址的域名,但您希望您的请求网址为

https://198.xxx.xxx.xxx/inbound/sms

{用您使用的任何路线替换/入站/短信}

然后在你的路线的顶部(我使用快递,所以我的设置可能看起来不同于你)

我有node.js twilio库

router.post('/sms/:username/:password'), function(req, res, next){
    username = req.params.username;
}

然后这是我/ sms路线的一个例子

  , twilio = require('twilio')
  , capability = new twilio.Capability(sid, auth)
  , client = require('twilio')(sid, auth)

答案 1 :(得分:0)

我本周遇到了这个问题,发现URL中有关Basic Auth的行为非常模糊。一方面,它似乎与HTTP相关:URI spec已弃用:

...
3.2.1.  User Information
...
Use of the format "user:password" in the userinfo field is deprecated.
...7.5.  Sensitive Information

URI producers should not provide a URI that contains a username or password that is intended to be secret.  URIs are frequently displayed by browsers, stored in clear text bookmarks, and logged by user agent history and intermediary applications (proxies).  A password appearing within the userinfo component is deprecated and should be considered an error (or simply ignored) except in those rare cases where the 'password' parameter is intended to be public.
...

因此,Firefox和Chrome似乎都将其剥离并忽略了它。但是,Curl似乎将其转换为有效的Authorization标头。

无论如何,我相信此功能实际上是HTTP用户代理的责任,并且看来Twilio的用户代理没有履行职责。因此,无法进行基本身份验证。

但是,看来Twilio的首选身份验证方法是仅使用您帐户的秘密身份验证密钥对请求进行签名,然后您可以在处理请求时进行验证。参见here

在研究原始NodeJS RequestIncomingMessage类时,似乎没有办法获得完整的原始URL来弥补Twilio的不合格。我相信这是因为HTTP请求的实际数据不包含完整的URL。

我的理解是,实际上是HTTP 用户代理负责从URL中提取和格式化身份验证信息。也就是说,一致的HTTP用户代理应解析URL本身,使用主机名和端口部分在正确的机器上找到正确的门,使用协议部分建立与侦听器的连接,将动词与URL的路径部分结合使用指示要激活的功能,然后大概负责将URL的auth部分转换为正式的HTTP Authorization标头。

由于用户代理无法运行,因此无法将身份验证数据获取到系统中。

(这是我目前的理解,尽管可能并不完全准确。其他人可以随时发表评论或纠正。)