私がそれを実装する方法は、クライアント (バックボーン) と RESTful Web サーバーの間にプロキシを導入することです。プロキシは、SSO と連携してユーザーの認証を管理します。したがって、API および/またはクライアント/Web サーバーを変更する必要はありません。ここに簡単なデモがあります:
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 でリッスンしている Web サーバーにルーティングされます。
特に、app.all('/*', ...)
API サーバーへのすべての呼び出しを設定すると、同じままですが、認証レイヤーが追加されます。この概念は、oauth で拡張するのは簡単です (ノードを使用している場合は、 passportjsを参照してください)。