【问题标题】:Sails REST API with simple AUTHSails REST API 和简单的 AUTH
【发布时间】:2014-11-30 13:07:35
【问题描述】:

我对风帆很陌生,但是在阅读了文档并在互联网上遵循了一些示例后,我决定试一试;)

我已经制作了一个依赖于 REST Web 服务的 APP,我想在 Sails 框架中构建它 - 但经过大量研究后,我还没有在 Sails 中找到合适的解决方案。

我想我想在从应用发出的每个 Web 服务调用中传递一个(用户名、密码)或一个 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.');
  }

// 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"
};

【问题讨论】:

  • 这是护照问题吗?你应该给它护照标签吗?

标签: web-services sails.js


【解决方案1】:

首先,像这样不断暴露用户名和密码是不好的做法。至少,您应该考虑发放一段时间后过期的 access_tokens,需要通过登录系统重新发放。

其次,如果您想对每个请求进行身份验证(而不是使用会话),最好使用 请求标头,而不是将凭据放在查询字符串中。在使用 Sails 蓝图时尤其如此;否则你将不得不为keep the blueprints from using your credentials as search criteria做额外的工作。

使用标头时,使用 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();
       });

}

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

module.exports = {

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

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 2018-09-16
    • 1970-01-01
    • 2014-04-25
    • 2015-09-16
    • 2014-12-21
    • 1970-01-01
    • 2021-06-11
    • 2016-07-08
    相关资源
    最近更新 更多