如何直接访问rails app中的API网址来获取current_user?我正在使用ng-auth-token和devise_token_auth进行身份验证

时间:2016-04-06 09:17:41

标签: ruby-on-rails angularjs

我正在使用ng-auth-token和devise_token_auth进行身份验证工作正常。我可以从前端登录,但是当我直接在浏览器中访问API网址时,它不会显示任何current_user。我想要做的是我想整合paypal结账,所以当我在用户授权后从paypal回到我的应用程序时,current_user是nil并且会话变量也是空的(即使我在转到paypal网站之前设置了一些会话变量)

如果我添加

before_action :authenticate_user!

它给了我

Filter chain halted as :authenticate_user! rendered or redirected

即使我已登录。

我不知道如何处理来自其他应用的回调响应。

3 个答案:

答案 0 :(得分:1)

我找到了解决方法,但仍在等待正确的解决方案。

# In ApplicationController
def authenticate_current_user
 head :unauthorized if get_current_user.nil?
end

def get_current_user
 return nil unless cookies[:auth_headers]
 auth_headers = JSON.parse cookies[:auth_headers]

 expiration_datetime = DateTime.strptime(auth_headers["expiry"], "%s")
 current_user = User.find_by(uid: auth_headers["uid"])

 if current_user &&
   current_user.tokens.has_key?(auth_headers["client"]) &&
   expiration_datetime > DateTime.now

   @current_user = current_user
 end
 @current_user
end

并在控制器中使用它

# In any controllers
before_action :authenticate_current_user

来源:https://github.com/lynndylanhurley/devise_token_auth/issues/74

感谢。

答案 1 :(得分:1)

Addon to Ankit的解决方案(代表太低而无法评论):

这对我的帖子请求失败了,因为Rails因为设置了protect_from_forgery而剥离了cookie:

class ApplicationController < ActionController::Base
  include DeviseTokenAuth::Concerns::SetUserByToken
  include Pundit
  protect_from_forgery with: :null_session # <-- this was the culprit
end

删除protect_from_forgery完全“解决”了这个问题,虽然我对它不满意。

真正的问题(至少在我看来)是ng-token-auth应该在标题中包含令牌,但只能在cookie中找到。我目前的猜测是,1)ng-token-auth没有正确设置其HttpInterceptor,或者2)其他一些拦截器事后正在弄乱它。 (我看过ng-file-upload会导致问题,但我没有使用它......)

答案 2 :(得分:0)

我最终在ApplicationController

中使用了此代码
before_action :merge_auth_headers

def merge_auth_headers
  if auth_headers = cookies[:auth_headers]
    request.headers.merge!(JSON.parse(auth_headers))
  end
end