かまたま日記3

プログラミングメイン、たまに日常

GoogleのAPIトークンをS3に保存する

GoogleAPI Clientには Google::Auth::TokenStore というトークンを保存するためのインターフェースが存在していて、デフォルトでは

  • Google::Auth::Stores::FileTokenStore
  • Google::Auth::Stores::RedisTokenStore

のふたつがある。これのS3バージョン。 ひとつ下の記事FileTokenStore を置き換えられる。

GCSじゃないの?というツッコミは無しで...w cacheは厳密にはいらないけど何回も呼ぶときがあるかなと思って用意しました。

require 'googleauth/token_store'
require 'aws-sdk'

class S3TokenStore < Google::Auth::TokenStore
  def initialize(bucket_name:, path_prefix:)
    @bucket = Aws::S3::Resource.new.bucket(bucket_name)
    raise "Bucket(#{bucket_name}) not exists" unless @bucket.exists?
    @path_prefix = path_prefix
    @cache = {}
  end

  def load(id)
    @cache[id] ||= begin
      object = object(id)
      if object.exists?
        object.get.body
      end
    end
  end

  def store(id, token)
    object(id).put(body: token)
    @cache[id] = token
  end

  def delete(id)
    object(id).delete
    @cache.delete(id)
  end

  private
  def object(key)
    @bucket.object("#{@path_prefix}#{key}")
  end
end