【问题标题】:using nodejs, express and basic auth how do i get username and password使用 nodejs、express 和基本身份验证如何获取用户名和密码
【发布时间】:2016-12-08 12:41:42
【问题描述】:

我正在使用nodejs,表达 将调用我的 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

这就是我现在在 POST 时看到的内容

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/callback

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

我一定遗漏了一些明显的东西

谢谢 兰迪

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    您应该可以在 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 / ":" )
    

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

    还有……

    7.5。敏感信息

    URI 生产者不应提供包含用户名或 旨在保密的密码。 URI 经常
    由浏览器显示,存储在明文书签中,并由
    用户代理历史和中间应用程序(代理)。
    用户信息组件中出现的密码已被弃用,
    应该被认为是一个错误(或简单地忽略),除了那些
    'password' 参数打算公开的极少数情况。

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


    我在 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 甚至不会传递用户名和密码信息。不幸的是,如果您尝试使用此模式,我认为您不走运。您可能必须设置授权标头,设置您自己的自定义标头(这是我过去所做的),或者在查询字符串中传递您的凭据。

    【讨论】:

    • 杰夫感谢您的帮助,没有运气更新错误的描述
    猜你喜欢
    • 2014-05-10
    • 2016-09-14
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2021-12-08
    • 2016-04-19
    相关资源
    最近更新 更多