0

次のコード行は、ターミナルから呼び出すと正常に機能します。Railsアプリ内から同等のものを実行して、access_tokenフィールドを更新したい(アクセストークンと更新トークンの使用を参照)。

curl https://api.box.com/oauth2/token \
-d 'grant_type=refresh_token&refresh_token={valid refresh token}&client_id={your_client_id}&client_secret={your_client_secret}' \
-X POST

すべてのパラメータが利用可能であると仮定すると、モデルまたはコントローラーからこのリクエストをどのように投稿しますか?

4

2 に答える 2

1

更新されたBoxOAuthトークンを取得するために、認証モデルに次のコードを実装することになりました。そうUser.authentication.find_by_provider('box').refresh!すれば、期限切れの場合のようなことができます(メソッドを介してBox APIを呼び出すたびにチェックしますtoken)。

  require 'uri'
  require 'net/http'

  def refresh!
    case self.provider
    when 'box'
      url = "https://api.box.com/oauth2/token"
      uri = URI(url)
      params = {}
      params["grant_type"] = "refresh_token"
      params["refresh_token"] = self.refresh_token
      params["client_id"] = APP_CONFIG['box_client_id']
      params["client_secret"] = APP_CONFIG['box_client_secret']
      res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
               req = Net::HTTP::Post.new(uri.path)
               req.set_form_data(params)
               response = http.request(req)
            end
      res_json = JSON.parse(res.body)
      self.refresh_token = res_json["refresh_token"]
      self.oauth_token = res_json["access_token"]
      self.expires_at = Time.now.to_i + res_json["expires_in"].to_i
      self.save      
    end
  end

  def fresh_token
    case self.provider
    when 'box'
      self.refresh! if self.is_expired? && self.is_refreshable?
      self.oauth_token
    else
      self.oauth_token
    end
  end


  def is_refreshable?
    case self.provider
    when 'box'
      Time.now < self.updated_at + 14.days ? true : false
    else
      nil
    end
  end


  def is_expired?
    case self.provider
    when 'box'
      Time.now.to_i > self.expires_at ? true : false
    else
      false      
    end
  end

たとえば、Boxユーザープロファイルを取得するには、次のようにします。

  def profile
    token = self.fresh_token

    case self.provider
    when 'box'
      profile = JSON.parse(open("https://api.box.com/2.0/users/me?access_token=#{token}").read)
    end
  end
于 2013-02-05T02:17:22.980 に答える
0
Net::HTTP.post_form(URI.parse("https://api.box.com/oauth2/token?grant_type=refresh_token&refresh_token=#{valid_refresh_token}&client_id=#{your_client_id}&client_secret=#{your_client_secret}"))
于 2013-02-04T23:51:30.100 に答える