使用nodejs,express和basic auth我如何获得用户名和密码

时间:2016-12-07 05:20:28

标签: node.js express

我正在使用nodejs,express 将调用我的api的第三方将使用http:// {username}:{password} @ yourdomain.com /

格式的基本身份验证

我试过了

var auth = require('basic-auth')

app.use(function(req, res, next) {
     var credentials = auth(req)
     if (req.headers.authorization) {
       console.log("found headers");
     }
}

但是这只有在头部传递基本身份验证时才有效。

我似乎无法从URL获取用户名和密码(这是外部方可以调用我的api的唯一方式)

然后我尝试使用url

这是我现在在看到

的时候所看到的
http://myusername:mypassword@localhost:4050/api/callback


var express = require('express');
var http = require('http');
var url = require('url');

var app = express();

app.use(function(req, res, next) {

    console.log("req.protocol=",req.protocol);
    console.log("req.get('host')=",req.get('host'));
    console.log("req.originalUrl=",req.originalUrl);
}

http.createServer(app).listen(config.port, function () {
     console.log("HTTP BandWidth listening on port " + config.port);

});

我的控制台看起来像

req.protocol = http

req.get('host')= localhost:4050

req.originalUrl = / API /回调

如果我转储整个req obj,我没有看到myusername或mypassword

我必须遗漏一些明显的东西

由于 好色

1 个答案:

答案 0 :(得分:0)

您应该能够在Node中使用内置的url包。

https://nodejs.org/dist/latest-v6.x/docs/api/url.html#url_urlobject_auth

const url = require('url');

app.use(function(req, res, next) {
    const urlObj = url.parse(req.protocol + '://' + req.get('host') + req.originalUrl);
    console.log('Auth info: ' + urlObj.auth);
}

希望这有帮助!

编辑:好吧,我接受了。看起来在URI中使用用户名和密码似乎已被弃用,浏览器可能只是忽略了这些信息。 See RFC 3986

  

<强> 3.2.1。用户信息

     

userinfo子组件可能包含用户名,并且   可选地,关于如何获得的特定于方案的信息   授权访问资源。用户信息,如果   现在,接着是一个界定它的商业符号(“@”)   来自主持人。

  userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )
     

在userinfo字段中使用“user:password”格式为
  的 弃用 即可。应用程序不应将任何数据呈现为明文   在userinfo中找到第一个冒号(“:”)字符后   子组件除非冒号后面的数据是空字符串
  (表示没有密码)。 应用程序可能会选择忽略或
   在收到此类数据作为参考
的一部分时拒绝此类数据   应拒绝以未加密的形式存储此类数据。该
  已经证明以明文形式传递认证信息   几乎在每种情况下都存在安全风险。

和...

  

<强> 7.5。敏感信息

     

URI生成器不应提供包含用户名或的URI   密码是秘密的。 URI经常是
  由浏览器显示,存储在明文书签中,并由
记录   用户代理历史记录和中介应用程序(代理)。的 A
  不推荐使用userinfo组件中出现的 密码
   应被视为错误(或简称忽略) ,但在那些中除外   “密码”参数旨在公开的罕见情况。

我添加了粗体和斜体......

我使用Chrome中的开发者工具尝试了这一点,并获得了以下内容:

常规

Request URL:http://foobar:password@localhost:8888/test
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8888

响应标题

Connection:keep-alive
Content-Length:19
Content-Type:application/json; charset=utf-8
Date:Thu, 08 Dec 2016 03:52:35 GMT
ETag:W/"13-uNGID+rxNJ6jDZKj/wrpcA"

请求标题

GET /test HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

因此,Chrome看起来甚至看不到用户名和密码信息。不幸的是,如果您尝试使用此架构,我认为您运气不好。您可能必须设置授权标头,设置自己的自定义标头(这是我过去所做的),或者在查询字符串中传递您的凭据。