首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于NODESSPI的企业环境中的节点

基于NODESSPI的企业环境中的节点
EN

Stack Overflow用户
提问于 2017-04-19 14:35:22
回答 1查看 3.4K关注 0票数 5

我开发了一个节点API,用于将数据提供给角应用程序。最初的想法是使用NODESSPI进行集成身份验证,因为我们计划在一个合作环境上运行这个功能。CORS将被需要,因为API节点将托管在不同的域上。

我很难使用诺德斯皮对$HTTP请求进行集成身份验证。

为了在我的计算机上测试它,我创建了一个简单的js文件,用express实例化一个节点服务器来运行我的角度应用程序(我知道它可以在没有express的情况下完成,但实现起来更快)。它在5001港口运行。

代码语言:javascript
复制
'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'));
});

我的角码还处于早期阶段,因为它的目的只是为了证明这个概念。注意,我没有在我的$http get上指定任何类型的标题。

main.controller.js

代码语言:javascript
复制
'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);
        })

    });

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

代码语言:javascript
复制
//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时,这个功能非常好。它检测我的用户帐户并返回我所属的所有窗口组。
  • 当运行我的角码时,它返回: Object {data:"",status: 401,config: Object,statusText:“running”}
  • 在使用Postman进行测试时,它也可以工作(授权类型= 'No Auth')
  • 当从路由器中删除所有NodeSSPI代码时,我可以接收数据(我已经用我的角度应用程序中的其他端点进行了测试),因此在服务器端正确地设置了CORS。

有什么东西是我遗漏的角边吗?我正努力从这里继续前进。感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2017-04-20 11:55:47

好吧,我终于开始工作了。所需的修改如下:

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

代码语言:javascript
复制
$http({
        url: 'http://localhost:3000/api',
        method: 'GET',
        withCredentials: true,
        headers : {
            'Content-Type' : 'application/json',    
            }
    })

位于节点服务器中,响应中需要一些响应头。原产地不能是“*”,您需要允许凭据。如果您需要允许动态起源,您可以在CORS文档中找到一种方法。

代码语言:javascript
复制
//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') );
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43498789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档