gpt4 book ai didi

javascript - 带有 NODESSPI 的企业环境中的 Node

转载 作者:搜寻专家 更新时间:2023-10-31 23:45:52 25 4
gpt4 key购买 nike

我开发了一个 NODE API 来为 Angular 应用程序提供数据。最初的想法是使用 NODESSPI 进行集成身份验证,因为我们计划在企业环境中运行它。将需要 CORS,因为 API Node 将托管在不同的域上。

我正在努力使用 NODESSPI用于 $HTTP 请求的集成身份验证。

为了在我的电脑上测试它,我创建了一个简单的 js 文件来实例化一个带有 express 的 Node 服务器来运行我的 Angular 应用程序(我知道它可以在没有 express 的情况下完成,但实现起来更快)。它在端口 5001 上运行。

'use strict';

var express = require('express');
var http = require('http');
var path = require('path');
var morgan = require('morgan');
var errorhandler = require('errorhandler');
var app = express();

// all environments
app.set('port', process.env.PORT || 5001);
app.set('views', path.join(__dirname, 'views'));
app.engine('html', require('ejs').renderFile);

app.use(morgan('dev'));

// serve up static assets
app.use(express.static(path.join(__dirname, 'app')));

// development only
if ('development' === app.get('env')) {
app.use(errorhandler());
}

console.log('trying to start server...', path.join(__dirname, 'app'));

http.createServer(app).listen(app.get('port'), function () {
console.log('App server listening on port ' + app.get('port'));
});

我的 Angular 代码处于非常早期的阶段,因为它的目的只是证明这个概念。请注意,我没有在我的 $http get 上指定任何类型的 header 。

main.controller.js

'use strict';

monthApp.controller('mainPageCtrl',
function mainPageCtrl($scope, $rootScope, $location, $rootElement, $q, $http) {
console.log("mainPageCtrl is in control");

$http({
url: 'http://localhost:3000/api/',
methof: 'GET'
})
.then(function(data){
console.log(data);
})
.catch(function(error){
console.log(error);
})

});

为了模拟服务器端运行我的 NODE API,我还使用 Express 并在端口 3000 上运行它,代码如下:

//Lib Dependecies
var cookieParser = require("cookie-parser");
var bodyParser = require("body-parser");
var sql = require("seriate");
var cors = require("cors");
var express = require("express");
var path = require("path");
var Q = require("q");
var oracle = require("oracledb");
var restClient = require("node-rest-client").Client;
var nodeSSPI = require('node-sspi');
var ActiveDirectory = require("activedirectory");

//API Custom Modules Dependecies
var reservoirApi = require("./reservoirApi");
var ldapApi = require("./ldapApi");
var energyApi = require("./energyApi");
var PIApi = require("./PIApi");

//Express config
var app = express();
app.use ( cors() );
app.options('*', cors() );
app.use ( bodyParser.json() );
app.use ( bodyParser.urlencoded( {extended: true} ) );
app.use ( cookieParser() );
app.use ( express.static( __dirname + '/public') );


//Server config
var serverConfig = {port: 3000};

//Sql server config
var config = {
"server":"myserver",
"user":"myuser",
"password":"mypass",
"database":"mydatabase"
};

sql.setDefaultConfig(config);

//Setup endpoint routes
var router = express.Router();

//Basic Router Config
router.use(function(req, res, next){

//Integrated Authentication for Windows
var nodeSSPIObj = new nodeSSPI({
retrieveGroups: true
});

try{
nodeSSPIObj.authenticate(req, res, function(err){
res.finished || next();
});
}
catch(err)
{
res.status(500).send(JSON.stringify({status: 500, message: "URL mal formatada, verifique sua requisição HTTP", detail: err.message}));
}
});

router.get('/', function(req, res){
res.json({Message: 'Data Access API.', AuthUser: req.connection.user, AuthUserGroups: req.connection.userGroups });
});

app.use('/api', router);

//Modules End-Point registration
reservoirApi.register(router);
ldapApi.register(router);
energyApi.register(router);
PIApi.register(router);

//Start Server
app.listen(serverConfig.port);
console.log("SOA API Listening port at " + serverConfig.port)

结果是:

  • 当使用 Chrome 到达地址时:http://localhost:3000/api这很好用。它检测我的用户帐户并返回我所属的所有 Windows 组。

  • 当运行我的 Angular 代码时,它返回:对象{数据:“”,状态:401,配置:对象,statusText:“未经授权”

  • 在使用 Postman 进行测试时它也可以工作(授权类型 = 'No Auth')

  • 从我的路由器中删除所有 NodeSSPI 代码时,我可以接收数据(我已经在我的 Angular 应用程序上使用其他端点进行了测试),因此在服务器端正确设置了 CORS。

Angular 方面有什么我遗漏的吗?我正在努力从这里前进。感谢任何帮助。

最佳答案

好的,我终于成功了。需要进行的更改如下:

在客户端 Angular 应用程序 您需要在 $http 请求上将 withCredentials 设置为 true。

$http({
url: 'http://localhost:3000/api',
method: 'GET',
withCredentials: true,
headers : {
'Content-Type' : 'application/json',
}
})

在 Node 服务器响应中需要一些响应 header 。来源不能是“*”,您需要允许凭据。如果您需要允许动态来源,您可以在 CORS documentation 中找到实现它的方法。 .

//Cors options
var corsOptions = {
origin: 'http://localhost:5001',
optionsSuccessStatus: 200,
credentials: true,
}

//Express config
var app = express();
app.use ( cors(corsOptions) );
app.use ( bodyParser.json() );
app.use ( bodyParser.urlencoded( {extended: true} ) );
app.use ( cookieParser() );
app.use ( express.static( __dirname + '/public') );

关于javascript - 带有 NODESSPI 的企业环境中的 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43498789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com