Node.JS中的基本HTTP身份validation?
我试图用NodeJS编写一个REST-API服务器,就像Joyent使用的服务器一样,除了我无法validation一个普通用户的身份validation外,一切正常。 如果我跳转到terminal,并执行curl -u username:password localhost:8000 -X GET
,我无法获取NodeJS http服务器上的值username:password。 如果我的NodeJS http服务器是类似的
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, "127.0.0.1");
,不应该得到值来自callback的req对象中的值username:password。 如何获得这些值,而不必使用Connect的基本httpauthentication ?
用户名:密码作为base64编码的string包含在授权标头中 。
尝试这个:
http.createServer(function(req,res){ var header=req.headers['authorization']||'', // get the header token=header.split(/\s+/).pop()||'', // and the encoded auth token auth=new Buffer(token, 'base64').toString(), // convert from base64 parts=auth.split(/:/), // split on colon username=parts[0], password=parts[1]; res.writeHead(200,{'Content-Type':'text/plain'}); res.end('username is "'+username+'" and password is "'+password+'"'); }).listen(1337,'127.0.0.1');
有关http授权的详细信息, 请访问http://www.ietf.org/rfc/rfc2617.txt
如果您使用express,则可以使用connect插件(包含在express中):
//Load express var express = require('express'); //User validation var auth = express.basicAuth(function(user, pass) { return (user == "super" && pass == "secret"); },'Super duper secret area'); //Password protected area app.get('/admin', auth, routes.admin);
如果从外部服务添加授权在您的路线图中,您可以使用node-http-digest进行基本authentication或者每个authentication。
我使用此代码为我自己的启动网站与身份validation。
它做了几件事情:
- 基本身份validation
- 为/ route返回index.html
- 在没有崩溃的情况下提供内容并且无声地处理错误
- 运行时允许使用端口参数
- 最小量的logging
在使用代码之前,npm install express
var express = require("express"); var app = express(); //User validation var auth = express.basicAuth(function(user, pass) { return (user == "username" && pass == "password") ? true : false; },'dev area'); /* serves main page */ app.get("/", auth, function(req, res) { try{ res.sendfile('index.html') }catch(e){} }); /* add your other paths here */ /* serves all the static files */ app.get(/^(.+)$/, auth, function(req, res){ try{ console.log('static file request : ' + req.params); res.sendfile( __dirname + req.params[0]); }catch(e){} }); var port = process.env.PORT || 8080; app.listen(port, function() { console.log("Listening on " + port); });
你可以使用http-auth模块
// Authentication module. var auth = require('http-auth'); var basic = auth.basic({ realm: "Simon Area.", file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ... }); // Creating new HTTP server. http.createServer(basic, function(req, res) { res.end("Welcome to private area - " + req.user + "!"); }).listen(1337);
它可以很容易地实现在纯粹的node.js没有依赖,这是我的版本,这是基于这个答案express.js,但简化,所以你可以很容易地看到基本的想法:
var http = require('http'); http.createServer(function (req, res) { var userpass = new Buffer((req.headers.authorization || '').split(' ')[1] || '', 'base64').toString(); if (userpass !== 'username:password') { res.writeHead(401, { 'WWW-Authenticate': 'Basic realm="nope"' }); res.end('HTTP Error 401 Unauthorized: Access is denied'); return; } res.end('You are in! Yay!'); }).listen(1337, '127.0.0.1');
- 使用Hibernate Validator进行交叉字段validation(JSR 303)
- 我怎样才能使用普通的HTTP身份validation和PHP在Apache下获得身份validation的用户名?
- PHP:最好的方法来检查input是否是一个有效的数字?
- 添加错误到Symfony 2表单元素
- 如何使用Twitter Bootstrappopup的jQueryvalidation通知?
- 如何在ASP.NET MVCvalidation期间提供警告?
- 如何在CakePHP中“validation”人名?
- 如何redirect到ASP.NET MVC中的dynamicloginURL
- 检查date是否在过去的Javascript