Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript EmberJS Rails API安全性_Javascript_Ruby On Rails_Ruby On Rails 3_Ember.js_Ember Data - Fatal编程技术网

Javascript EmberJS Rails API安全性

Javascript EmberJS Rails API安全性,javascript,ruby-on-rails,ruby-on-rails-3,ember.js,ember-data,Javascript,Ruby On Rails,Ruby On Rails 3,Ember.js,Ember Data,安装程序是一个带有使用JSON api的rails后端的Ember前端 一切进展顺利,但确实出现了一些问题: 如何确保只有emberjs应用程序使用api?我不希望脚本编写人员编写应用程序来使用后端api 这一切看起来都很不安全,因为EmberJS应用程序将以.js文件的形式提供给客户端 如果每个人都可以访问JS控制台,我如何确保一个用户就是那个用户 您可以扩展RESTAdapter并覆盖ajax方法,将身份验证令牌包括在哈希中,并且您需要确保控制器验证该令牌 在我的环境(.NET)中,我的应用

安装程序是一个带有使用JSON api的rails后端的Ember前端

一切进展顺利,但确实出现了一些问题:

如何确保只有emberjs应用程序使用api?我不希望脚本编写人员编写应用程序来使用后端api

这一切看起来都很不安全,因为EmberJS应用程序将以.js文件的形式提供给客户端


如果每个人都可以访问JS控制台,我如何确保一个用户就是那个用户

您可以扩展
RESTAdapter
并覆盖
ajax
方法,将身份验证令牌包括在哈希中,并且您需要确保控制器验证该令牌

在我的环境(.NET)中,我的应用程序呈现的文档的隐藏字段中有身份验证令牌,因此我的
ajax
覆盖如下所示:

App.Adapter = DS.RESTAdapter.extend({
  ajax: function(url, type, hash, dataType) {
      hash.url = url;
      hash.type = type;
      hash.dataType = dataType || 'json';
      hash.contentType = 'application/json; charset=utf-8';
      hash.context = this;
      if (hash.data && type !== 'GET') {
        hash.data = JSON.stringify(hash.data);
      }
      var antiForgeryToken = $('#antiForgeryTokenHidden').val();
      if (antiForgeryToken) {
          hash = {
            'RequestVerificationToken': antiForgeryToken
          };
      }
      jQuery.ajax(hash);
    }
});
令牌可以来自cookie或您定义的任何内容,只要您能够将其包含在请求头中并让控制器验证它(可能在\u filter之前的
中),它就足够了

然后在存储中,传递新适配器,而不是默认适配器(RESTAdapter)


注意:将更改为赞成或
Ember.RSVP
,使此覆盖不推荐使用。它必须在下一个版本后更新,但对于第12版应该可以。

您可以扩展
RESTAdapter
并覆盖
ajax
方法以将身份验证令牌包括在哈希中,并且您需要确保控制器验证该令牌

在我的环境(.NET)中,我的应用程序呈现的文档的隐藏字段中有身份验证令牌,因此我的
ajax
覆盖如下所示:

App.Adapter = DS.RESTAdapter.extend({
  ajax: function(url, type, hash, dataType) {
      hash.url = url;
      hash.type = type;
      hash.dataType = dataType || 'json';
      hash.contentType = 'application/json; charset=utf-8';
      hash.context = this;
      if (hash.data && type !== 'GET') {
        hash.data = JSON.stringify(hash.data);
      }
      var antiForgeryToken = $('#antiForgeryTokenHidden').val();
      if (antiForgeryToken) {
          hash = {
            'RequestVerificationToken': antiForgeryToken
          };
      }
      jQuery.ajax(hash);
    }
});
令牌可以来自cookie或您定义的任何内容,只要您能够将其包含在请求头中并让控制器验证它(可能在\u filter
之前的
中),它就足够了

然后在存储中,传递新适配器,而不是默认适配器(RESTAdapter)

注意:将更改为赞成或
Ember.RSVP
,使此覆盖不推荐使用。它必须在下一个版本后更新,但对于第12版应该可以。

我使用它进行用户身份验证和API授权,效果非常好

我使用Oauth 2用户密码授权类型对用户进行身份验证,并通过承载令牌授权应用程序,该令牌必须在将来的所有API请求中发送。这意味着用户在客户端应用程序中输入用户名/电子邮件和密码,然后客户端应用程序通过HTTPS发送到服务器,以获取授权令牌和刷新令牌。所有请求都必须通过HTTPS来保护承载令牌的泄露

我在app/initializers/auth中有以下内容:

Em.Application.initializer
  name: 'authentication'
  initialize: (container, application) ->
    Em.SimpleAuth.Authenticators.OAuth2.reopen
      serverTokenEndpoint: 'yourserver.com/api/tokens'
    Em.SimpleAuth.setup container, application,
      authorizerFactory: 'authorizer:oauth2-bearer'
      crossOriginWhitelist: ['yourserver.com']
在app/controllers/login.coffee中:

App.LoginController = Em.Controller.extend Em.SimpleAuth.LoginControllerMixin,
  authenticatorFactory: 'ember-simple-auth-authenticator:oauth2-password-grant'
应用程序内/routes/router.coffee:

App.Router.map ->
  @route 'login'
  # other routes as required...
应用程序/路线/应用程序中的咖啡:

App.ApplicationRoute = App.Route.extend Em.SimpleAuth.ApplicationRouteMixin
应用程序内/routes/protected.coffee:

App.ProtectedRoute = Ember.Route.extend Em.SimpleAuth.AuthenticatedRouteMixin
在templates/login.hbs中(我使用的是Ember EasyForm):

{{{控制器的形式}
{{输入标识
label=“用户”
占位符=”you@example.com"
hint='输入您的电子邮件地址。'}}
{{输入密码
as=“密码”
hint=“输入您的密码。”
值=密码}
登录
{{/form}
要保护路由,我只需从App.ProtectedRoute扩展或使用受保护的路由mixin

您的服务器需要在上面配置的服务器令牌端点处处理Oauth 2请求和响应。这很容易做到,描述了如果服务器端框架没有内置对Oauth2的支持,那么请求和响应。但是,您需要在服务器上存储、跟踪这些令牌并使其过期。有一些方法可以避免存储令牌,但这超出了问题的范围:)

我已经回答了后端问题,并提供了用于用户身份验证、API授权和令牌身份验证的示例rails示例代码

我正在使用这些示例代码进行用户身份验证和API授权

我使用Oauth 2用户密码授权类型对用户进行身份验证,并通过承载令牌授权应用程序,该令牌必须在将来的所有API请求中发送。这意味着用户在客户端应用程序中输入用户名/电子邮件和密码,然后客户端应用程序通过HTTPS发送到服务器,以获取授权令牌和刷新令牌。所有请求都必须通过HTTPS来保护承载令牌的泄露

我在app/initializers/auth中有以下内容:

Em.Application.initializer
  name: 'authentication'
  initialize: (container, application) ->
    Em.SimpleAuth.Authenticators.OAuth2.reopen
      serverTokenEndpoint: 'yourserver.com/api/tokens'
    Em.SimpleAuth.setup container, application,
      authorizerFactory: 'authorizer:oauth2-bearer'
      crossOriginWhitelist: ['yourserver.com']
在app/controllers/login.coffee中:

App.LoginController = Em.Controller.extend Em.SimpleAuth.LoginControllerMixin,
  authenticatorFactory: 'ember-simple-auth-authenticator:oauth2-password-grant'
应用程序内/routes/router.coffee:

App.Router.map ->
  @route 'login'
  # other routes as required...
应用程序/路线/应用程序中的咖啡:

App.ApplicationRoute = App.Route.extend Em.SimpleAuth.ApplicationRouteMixin
应用程序内/routes/protected.coffee:

App.ProtectedRoute = Ember.Route.extend Em.SimpleAuth.AuthenticatedRouteMixin
在templates/login.hbs中(我使用的是Ember EasyForm):

{{{控制器的形式}
{{输入标识
label=“用户”
占位符=”you@example.com"
hint='输入您的电子邮件地址。'}}
{{输入密码
as=“密码”
hint=“输入您的密码。”
值=密码}
登录
{{/form}
要保护路由,我只需从App.ProtectedRoute扩展或使用受保护的路由mixin

您的服务器需要在上面配置的服务器令牌端点处处理Oauth 2请求和响应。这很容易做到,描述了如果服务器端框架没有内置对Oauth2的支持,那么请求和响应。但是,您需要在服务器上存储、跟踪这些令牌并使其过期。有一些方法可以避免存储令牌,但这超出了问题的范围:)


我已经回答了后端问题,并提供了用于用户身份验证、API授权和令牌身份验证的示例rails示例代码

现在还支持流行的rails gem Desive,这使得与rails应用程序的集成非常容易。Desive取消了对基于令牌的身份验证的支持