使用emberjs和devise进行身份验证

时间:2014-02-21 21:36:57

标签: ruby-on-rails api ember.js devise

我正在使用ember js来验证我的rails api 我的设计会议控制器

module Api
class SessionsController < Devise::SessionsController

  def create
   unless params[:email] && params[:password]
  return invalid_params('You need to provide both email and password')
  end

  res = User.find_for_database_authentication(email: params[:email])

 if res && res.valid_password?(params[:password])
    user = res
  end
 unless user
   unless params[:email] && params[:password]
  return invalid_params('invalid email or password')
  else
   return invalid_params('You need to provide both email and password')
  end 
else
 sign_in user
  user.ensure_authentication_token!
 render json: user ,serializer: UserSerializer ,status: 201
   end
end

protected

 def invalid_params(errorMessage)
 warden.custom_failure!
 render json: { errorMessage: errorMessage }, status: 403
end
end
end

我的emberjs auth.js

Auth =Ember.Object.extend({
auth_token: null,
current_user: null,
signIn: function(params) {

 return Ember.$.post('http://localhost:3001/api/users/sign_in',   params).then((function(_this) {
  return function(response) {
    return _this.set('auth_token', response.auth_token);

  };
})(this));


   },
   signUp: function(params) {
    var mypar = {'user':params};
    var that=this;
        return Ember.$.post('/users', mypar,function(data){
   return that.set('auth_token', data.auth_token);
  });
 },
 signOut: function(){
  promise= Ember.$.ajax("/users/sign_out",{
    type: "DELETE"
});
var that =this;
promise.then(function(){
    that.set("auth_token",null);
});
return promise;
  }

  });

   Remon.Auth =Auth.create();
 $.ajaxSetup({

   beforeSend: function(xhr, options) {
    var encoded_auth_token, header;
   if (Remon.Auth.get('auth_token')) {
    encoded_auth_token = Base64.encode64(Remon.Auth.get('auth_token') + ":X");
    header = "Basic " + encoded_auth_token;
   return xhr.setRequestHeader('Authorization', header);
  }
 },
error: function(xhr) {
  if (xhr.status === 401) {
  //return window.location = '/#/login';

   }
 }
});

登录并注册工作也很好我从会话控制器获得了用户身份验证令牌,但登录的会话无法正常工作,因为我试图将json数据传输到另一个路由 它没有在其他控制器中工作我有这些方法

   module Api
 class ProfilesController < ApplicationController


 before_filter :auth_only?
def index
@profiles =Profile.all
 end 
end 
end 

在devise.rb中       config.http_authenticatable = [:token]

并在application_controller.rb

   skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }


 def allow_ajax_request_from_other_domains
 headers['Access-Control-Allow-Origin'] = '*'
  headers['Access-Control-Request-Method'] = '*'
  end

1 个答案:

答案 0 :(得分:1)

(正在进行中的答案)

EmberCasts有一个很棒的2部分关于在Ember中实现客户端身份验证的视频。我认为这有助于清理代码的Ember方面。

  

登录会话不起作用,因为我试图将json数据发送到其他路由时无法正常工作

这听起来像你的Rails方面没有保持登录状态,如果是这种情况,那么我建议你查看Devise并确保你能够使用你的令牌访问API。

我将在接下来的几天内实施Devise + Ember,所以当我自己弄明白时,我会用更多信息更新这个答案。