使用 ActiveResource 和会话令牌验证请求

Authenticating requests using ActiveResource and session tokens

我有一个 rails API 和一个 rails 客户端应用程序,它们通过 ActiveResource 相互通信。这很好用,直到我需要为每个 ActiveResource 请求传递一个唯一的令牌来验证用户身份。据我了解,ActiveResource 令牌设置在 class 级别并且不能轻易更改,如果我希望人们在经过身份验证后传递他们唯一的会话令牌,这显然是一个问题。

这是我要实现的流程:

  1. 用户在客户端应用程序上提交凭据。
  2. 客户端应用程序将凭据传输到 API。
  3. API 通过 Devise 和 returns 验证令牌验证凭据。
  4. 客户端收到授权令牌并保存在会话中。
  5. 来自客户端的所有后续请求都包含授权令牌。
  6. API 使用包含的身份验证令牌对所有请求进行身份验证。

SO 和 Github 上有很多不同的帖子。有人说 it simply cannot be done, others say that you can force it, but there are issues with threading.

如何在不失去 ActiveResource 提供的巨大好处的情况下完成我想做的事情?

Active Resource 在过去一年左右经历了相当大的更新,现在在现代网络中运行良好。

Active Resource 支持 Rails 通过 ActionController::HttpAuthentication::Token class 使用自定义 header 提供的 token based authentication

class Person < ActiveResource::Base
  self.headers['Authorization'] = 'Token token="abcd"'
end

您还可以使用相同的方式设置任何特定的 HTTP header。上面说了header是thread-safe,所以可以动态设置header,即使在multi-threaded 环境:

ActiveResource::Base.headers['Authorization'] = current_session_api_token

我在 API 控制器中使用第二种方法非常成功地将 OAuth JWT 策略与 Active Resource 结合使用:

ActiveResource::Base.headers['Authorization'] = "Bearer #{jwt.token}"