pkd*_*dkk 5 web-services sails.js
我对风帆很陌生,但在阅读了文档并在互联网上关注了一些例子后,我决定试一试;)
我已经制作了一个依赖于我想在Sails框架中构建的REST Web服务的APP - 但经过大量的研究后我还没有在风帆中找到合适的解决方案.
我想我想在从应用程序发出的每个webservice调用中传递(用户名,密码)或api_key?
我找到的所有示例都只使用会话登录方法 - 而不是每次调用都使用API密钥.
我用过这个教程 - http://jethrokuan.github.io/2013/12/19/Using-Passport-With-Sails-JS.html
但只能登录到登录页面 - 我希望它在每次调用时登录,并且仍然希望使用REST API蓝图中的构建.
我的解决方案中的问题是,这样的调用 - 由于默认的REST方法,不会按预期给我所有用户 - 我希望它授权用户并给我结果..
http://example.com:1337/user/?username=test&password=xxx
使用REST Web服务后端构建APP的"最佳实践"是什么? - "带帆"
我的一些代码:
// policies/authentication.js
if(req.param('username') && req.param('password')) {
UserAuth.auth(req, res, function(err, user) {
if (err) return res.forbidden('You are not permitted to perform this action.');
if(user) {
return next();
}
});
}else{
return res.forbidden('You are not permitted to perform this action.');
}
Run Code Online (Sandbox Code Playgroud)
// services/UserAuth.js
module.exports = {
auth : function(req, res, cb) {
var bcrypt = require('bcrypt');
var passport = require("passport");
passport.authenticate('local', function(err, user, info){
if (err) return cb({ error: 'auth error!', status: 400 });
if(user) {
cb(null, user);
}
})(req, res);
}
}
Run Code Online (Sandbox Code Playgroud)
// config/policies.js
module.exports.policies = {
'*': "authentication"
};
Run Code Online (Sandbox Code Playgroud)
首先,像这样不断地公开用户名和密码是不好的做法。至少,您应该考虑颁发在一段时间后过期的access_token,并且需要通过登录系统重新颁发。
其次,如果您想对每个请求进行身份验证(而不是使用会话),最好使用请求标头来执行此操作,而不是将凭据放入查询字符串中。使用 Sails 蓝图时尤其如此;否则,您将不得不做额外的工作来防止蓝图使用您的凭据作为搜索条件。
使用标头时,Sails 的每个请求授权变得简单。在api/policies中设置一个名为(例如)auth.js 的策略:
module.exports = function (req, res, next) {
// Find an access header
var accessToken = req.header('my-auth-header');
// No header, no access
if (!accessToken) {return res.forbidden();}
// Find the user with that token
User.findOne({accessToken: accessToken})
.exec(function(err, user) {
// Handle error
if (err) {return next(err);}
// Handle bad access token
if (!user) {return res.forbidden();}
// Handle success
return next();
});
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用config/policies.js文件设置需要身份验证的任何控制器操作:
module.exports = {
SomeController: {
'*': 'auth'
},
...etc...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2450 次 |
| 最近记录: |