2

我在我的应用程序中使用 Authlogic 进行身份验证,使用标准的 User 和 UserSession 模型。我正在将 API 构建到我的应用程序中,并且我想使用单个访问令牌对 API 访问进行身份验证。在我的应用程序中,每个用户belongs_to都是一个公司,哪些has_many用户。API 用于访问属于公司的资源,因此我想为整个公司使用一个访问令牌。

我最初的想法是向 Company 添加一个仅有权访问 API 的虚拟用户,然后公司将使用其单一访问令牌来授予对 API 的访问权限。看来我不能使用 AuthLogic 将用户的电子邮件和密码设置为空白,所以这不会成功。我的下一个想法是也许我可以添加acts_as_authentic到公司本身,但我不确定这将如何运作。

我真的很想为解决方案使用 Authlogic,因为它与我的 ACL 很好地集成,并且似乎具有我正在寻找的主要内置功能。

有可能有两个模型act_as_authentic吗?有没有一种我没有想到的更简单的方法,内置在 Authlogic 中?有没有办法可以使用虚拟用户作为他们的 API 密钥?我应该以哪种方式做到这一点?

4

2 回答 2

4

我这样做的方法是:

class Something
  acts_as_authentic do |m|
    # API keys are auto generated (See +regenerate_api_key+.)
    # The password is not used for authentication (its just an api_key lookup), so a dummy field is used
    m.login_field = :api_key
    m.validate_login_field = false
    m.validate_email_field = false
    m.crypted_password_field = :api_key_hash
    m.require_password_confirmation = false
    m.validate_password_field = false
    m.crypto_provider = ApiKeyCrypto
  end
end

class ApiKeyCrypto
  def self.encrypt(*tokens)
    'X'
  end

  def self.matches?(crypted, *tokens)
    crypted == 'X'
  end
end

#application_controller.rb
def current_session
  return @current_session if defined?(@current_session)
  ...
    format.any(*api_formats) do
      @current_session = SomethingSession.find
    end
  end
  @current_session
end
def api_formats
  [:xml, :json]
end

这适用于 ActiveResource 仅供参考。

于 2009-11-07T03:35:17.267 回答
1

当然,你可以有两个模型acts_as_authentic。使用最少的 Authlogic db fields设置Company,并将其single_access_token用于 API 访问。请注意,您的 API 不知道哪个User正在使用系统,只知道Company.

于 2009-11-07T16:22:11.487 回答