2017-04-19 116 views
1

我開發了一個NODE API來爲Angular應用程序提供數據。最初的想法是使用NODESSPI進行集成身份驗證,因爲我們計劃在法人環境中運行此操作。由於API節點將託管在不同的域上,所以需要CORS。NODESSPI在法人環境中的節點

我很努力地使用NODESSPI進行$ HTTP請求的集成驗證。

爲了在我的電腦上測試它,我創建了一個簡單的js文件,用express來實例化一個節點服務器來運行我的角度應用程序(我知道它可以不用快速完成,但實現起來更快)。它運行在Port 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中指定任何類型的頭文件。

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模擬服務器端,我還使用快車,並在端口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) 

的結果是:

  • 當用C hrome到達地址:http://localhost:3000/api這工作得很好。它檢測我的用戶帳戶並返回我所屬的所有窗口組。

  • 當運行我的角碼返回: 對象{數據:「」狀態:401,配置:對象,狀態文本:「未授權」}

  • 當郵差測試它也可以(與授權當我從路由器中刪除所有NodeSSPI代碼時,我可以接收數據(我已經在我的角度應用程序上測試了其他終端),因此CORS在服務器端正確設置。

有什麼我在Angular方面失蹤?我正努力從這裏前進。感謝任何幫助。

回答

0

好吧,我終於得到了這個工作。需要如下的變化:

在客戶端應用程序角度 您需要withCredentials設置爲true $ HTTP請求。

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

在節點服務器 都需要在響應一些響應頭。 Origin不能是'*',你需要允許憑證。如果您需要允許動態來源,您可以在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'));