【问题标题】:Rails: How can I check if the access_token is expired?Rails:如何检查 access_token 是否过期?
【发布时间】:2012-11-05 05:26:56
【问题描述】:

我正在为带有 rails 的 android 应用程序编写一个 api。由于我对 rails 和 android 都是新手,所以我无法弄清楚 access_token 的内容。

我有一个Token模型,每次用户登录时,都会在tokens表中添加一个新的access_token。我的问题是,如果我在创建令牌后设置过期日期 == 3 天,那么当用户发送带有 access_token 的请求时,验证这一点的正确方法是什么?如何删除那些过期的令牌?

这是我的代币模型:

# Table name: tokens
#
#  id           :integer          not null, primary key
#  access_token :string(255)
#  user_id      :integer
#  created_at   :datetime         not null
#  updated_at   :datetime         not null

class Token < ActiveRecord::Base
  attr_accessible   :access_token, :user_id
  before_validation :generate_access_token
  belongs_to        :user

  validates :access_token, presence: true, uniqueness: true
  validates :user_id,      presence: true, uniqueness: true

private

  def generate_access_token
    begin
      self.access_token = SecureRandom.hex
    end while self.class.exists?(access_token: access_token)
  end
end

【问题讨论】:

    标签: ruby-on-rails access-token


    【解决方案1】:

    您可以在 Token 模型中添加一个 expires_at 列来处理它。您还需要一种检索新令牌的方法,该方法可以更新现有令牌的密钥和过期时间,或者您可以为用户生成新的令牌记录并将其返回。后者更像是 Facebook 为其访问令牌所采用的方法。

    【讨论】:

    • 感谢您的回复!我不知道我理解对不对。如果我使用后面的方法,流程是:用户发送请求时,检查access_token是否存在,如果存在,检查当前时间> expires_at,如果是,删除旧token,要求用户重新登录,然后生成一个新的令牌。对于那些未在请求中使用的过期令牌,只需将它们留在表中即可。对吗?
    • 基本上,是的。如果您将访问令牌用作 API 的一部分,则您的 API 应在令牌过期时响应错误。这样,为您的 API 编写代码的人就可以捕捉到这一点并采取相应的行动。保留旧令牌由您决定,因此您可以根据需要告诉他们何时过期。这样做并不完全必要,但可能会有所帮助。
    • 知道了。我想知道,既然它只是我们自己的android应用程序的一个API,那么不设置expires_at列是否是一种常见的方法,这意味着令牌只有在用户明确注销时才会过期?
    • 如果您正在使用来自 Devise 的会话或其他东西对用户进行身份验证,我实际上只是在没有 API 令牌的情况下使用它。由于您控制 android 应用程序,因此您不一定需要拥有令牌。当任何人都可以与您的 API 交互时,它们会更有用。
    • 感谢您的解释。
    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多