我有一个rails API和一个rail客户端应用程序,它们通过ActiveResource
相互通信。这非常有效,直到我需要在每个ActiveResource
请求中传递一个唯一的令牌来验证用户。据我所知,ActiveResource
令牌是在类级别设置的,不能轻易更改,如果我希望人们在经过身份验证后传递他们的唯一会话令牌,这显然是一个问题。
以下是我试图实现的流程:
- 用户在客户端应用程序上提交凭据
- 客户端应用程序将凭据传输到API
- API通过Devise验证凭据并返回一个auth令牌
- 客户端接收身份验证令牌并保存在会话中
- 来自客户端的所有后续请求都包含auth令牌
- API使用包含的身份验证令牌对所有请求进行身份验证
SO和Github上有很多关于这方面的不同帖子。有人说这根本无法完成,也有人说你可以强制执行,但线程存在问题。
我如何才能在不失去ActiveResource提供的巨大好处的情况下完成我想要做的事情?
Active Resource在过去一年左右经历了相当大的更新,现在在现代网络中运行良好。
Active Resource支持Rails通过ActionController::HttpAuthentication::token类使用自定义头提供的基于令牌的身份验证。
class Person < ActiveResource::Base
self.headers['Authorization'] = 'Token token="abcd"'
end
您也可以使用相同的方式设置任何特定的HTTP标头。如上所述,标头是线程安全的,因此即使在多线程环境中也可以动态设置标头:
ActiveResource::Base.headers['Authorization'] = current_session_api_token
我在API控制器中使用了第二种方法:,非常成功地将OAuth JWT策略与Active Resource一起使用
ActiveResource::Base.headers['Authorization'] = "Bearer #{jwt.token}"