我正在使用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
我必须遗漏一些明显的东西
由于 好色
答案 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看起来甚至看不到用户名和密码信息。不幸的是,如果您尝试使用此架构,我认为您运气不好。您可能必须设置授权标头,设置自己的自定义标头(这是我过去所做的),或者在查询字符串中传递您的凭据。