我正在使用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
即使我已登录。
我不知道如何处理来自其他应用的回调响应。
答案 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