我有一个PEAN (Postgre, Express, Angular, NodeJS) Stack
申请。 Web服务使用
节点和快递
使用工厂方法在AngularJS
service.js
中消费。
现在,例如,当我点击Heroku
帐户{@ 3}}上部署的网址时,我实际上可以在浏览器上看到所有JSON
数据。
无论如何,我是否可以在外行人访问网址和提供给他的数据之间加上一层,或者是它必须工作的方式。
感谢所有回复。我已经检查了OAuth npm包,但是它提供了基本的会话管理功能,是否有任何特定的功能可以满足我的目的?
答案 0 :(得分:1)
如果您的目标是向使用浏览器访问api URL的人员提供不同的内容,则可以让Express站点检查请求标头Accept。如果Accept是“text / html”服务HTML页面,无论你想要什么(在布局或该方法的API文档中格式化的数据等),如果Accept是“application / json”提供API数据。
如果您正在追求安全性和身份验证,那就是另一回事: - )
答案 1 :(得分:1)
我试图实现类似的东西,
您可以使用带有JSON Web令牌的护照本地策略
/ login /提供了用户名和密码,如果两者都正确则会发送JWT
然后您将随每个请求收到的令牌发送到受保护的路由器
示例代码:
var pg = require('pg');
var express = require('express');
var bodyParser = require('body-parser');
var passport = require('passport');
var jwt = require('jsonwebtoken');
var jwtcheck = require('express-jwt');
var LocalStrategy = require('passport-local').Strategy;
var app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(passport.initialize());
app.use(express.static(__dirname + '/client'));
secret = 'aMdoeb5ed87zarRdkD6greDZL81DcnrzeSD648ferFejmplx';
var port = process.env.PORT || 8080; // set our port
var User = [
{ id: 1, Username: 'bob', password: 'secret', email: 'bob@example.com',apikey: 'bob' }
, { id: 2, Username: 'joe', password: 'birthday', email: 'joe@example.com',apikey: 'gfsdgsfgsfg' }
];
function findByApiKey(apikey, fn) {
for (var i = 0, len = User.length; i < len; i++) {
var user = User[i];
if (user.apikey === apikey) {
return fn(null, user);
}
}
return fn(null, null);
}
passport.use('login', new LocalStrategy(
function(username, password, done) {
findByApiKey(username, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
return done(null, user);
});
}
));
app.post('/login', function(req, res, next) {
passport.authenticate('login', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
return res.json(401, { error: 'message' });
}
var token = jwt.sign({ username: 'somedata'}, secret, { expiresInMinutes: 2 });
res.json({ token : token });
})(req, res, next);
});
app.get('/db/:db/schema/:schema/relation/:relation/:id',
jwtcheck({secret: secret}),
function(req, res) {
var conString = "postgres://ali@localhost/rest";
var client = new pg.Client(conString);
client.connect(function(err) {
if(err) {
return console.error('could not connect to postgres', err);
}
client.query('SELECT * from ' + req.params.schema +'.'+ req.params.relation , function(err, result) {
if(err) {
return console.error('error running query', err);
}
res.send(JSON.stringify(result.rows));
client.end();
});
});
});
app.listen(port);