我实现它的方式是在客户端(Backbone)和 RESTful 网络服务器之间引入一个代理。代理与 SSO 一起管理用户的身份验证。因此无需更改 api 和/或客户端/网络服务器。这是一个快速演示:
var http = require('http'),
httpProxy = require('http-proxy'),
express = require('express');
var proxy = new httpProxy.RoutingProxy();
var app = express();
function ensureAuthenticated(req, res, next) {
if (isLoggedIn) { return next(); }
res.redirect('/');
}
// This should be your (RESTful) webserver
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
res.end();
}).listen(9000);
var isLoggedIn = false;
app.get('/', function(req, res){
console.log(isLoggedIn)
res.send('Logged in? ' + isLoggedIn);
});
app.get('/login', function(req, res){
isLoggedIn = true;
res.redirect('/');
});
app.get('/logout', function(req, res){
isLoggedIn = false;
res.redirect('/');
});
app.all('/api/*', ensureAuthenticated, function(req, res) {
return proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
});
app.listen(8000);
第一次访问该页面时,您已注销,并且任何对的调用/api/something
都会重定向到/
. 当您登录(访问/login
页面)时,所有请求/api/*
都通过代理路由到侦听端口 9000 的网络服务器。
特别是,当您将app.all('/*', ...)
所有对 API 服务器的调用设置为保持不变但增加了身份验证层时。使用 oauth 扩展这个概念很简单(如果您使用的是 node,请查看passportjs )。