2014-10-06 44 views
5

我是很新,帆,但阅读文档,随后在互联网一些例子之后,我决定给它一个镜头;)简单AUTH帆REST API

我已经依赖的APP在我想在Sails Framework中构建的REST Web服务上 - 但经过大量研究后,我尚未找到正确的解决方案。

我想我想通过一个(用户名,密码)或api_key在每个应用程序从web服务调用?

我发现的所有例子都只是使用会话登录方法 - 而不是在每个调用中使用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 webservice后端构建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.'); 
    } 

// 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); 

    } 
} 

// config/policies.js 
module.exports.policies = { 

    '*': "authentication" 
}; 
+0

这是护照问题?你应该给它护照标签吗? – Meeker 2014-10-06 14:49:46

回答

3

首先,它是不好的做法,不断暴露用户名和密码在野外样这个。至少,你应该考虑发行access_tokens,这些在一段时间后过期,需要通过登录系统重新发行。其次,如果您想要在每个请求(而不是使用会话)上进行身份验证,最好使用请求标头,而不是将凭据放入查询字符串中。使用Sails蓝图时尤其如此;否则你将不得不做额外的工作keep the blueprints from using your credentials as search criteria

使用标题时,Sails会使每个请求的授权变得简单。建立一个政策称为(例如)API /政策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(); 
     }); 

} 

然后你可以设置使用config/policies.js file需要身份验证的控制器操作:

module.exports = { 

    SomeController: { 
     '*': 'auth' 
    }, 
    ...etc... 
}