22

omn​​iauth-facebook を使用して FB に対してユーザーを認証する (およびユーザーの FB OAuth アクセス トークンを取得する) Rails アプリを作成しています。その後、アプリは Koala を使用して、保存された OAuth トークンを使用して FB Graph API へのさまざまな呼び出しを行います。

ユーザーが再認証するたびに (通常はアプリにログインするとき)、保存されたトークンを更新します。それでも、その保存されたトークンは時々期限切れになります (または無効になります)。

Koala の使用中に認証の失敗を防ぎ、トークンを更新するためのベスト プラクティスは何ですか?

FB に対してユーザーを再認証する例外ハンドラーを使用して、すべての呼び出しを begin/rescue ブロックでラップする必要がありますか?

ここで説明されている「アクセス トークンの拡張」プロセスを利用する (Koala を使用する) 方法はありますか? そうでない場合、Koala 呼び出しから新しいトークンを自分で抽出するための独自のコードを作成するためのベスト プラクティスはありますか?

4

3 に答える 3

17

私が持っているのは、アクティブなFacebookセッションを必要とするすべてのページでトリガーされるbefore_filterです。このようなものが機能するはずです:

  before_filter :reconnect_with_facebook
  def reconnect_with_facebook
    if current_account && current_account.token_expired?(session[:fb]["expires"])

    # re-request a token from facebook. Assume that we got a new token so
    # update it anyhow...
    session[:return_to] = request.env["REQUEST_URI"] unless request.env["REQUEST_URI"] == facebook_request_path
    redirect_to(with_canvas(facebook_request_path)) and return false
  end
end

token_expired?メソッドは次のようになります。

def token_expired?(new_time = nil)
  expiry = (new_time.nil? ? token_expires_at : Time.at(new_time))
  return true if expiry < Time.now ## expired token, so we should quickly return
  token_expires_at = expiry
  save if changed?
  false # token not expired. :D
end
于 2012-05-01T01:03:19.090 に答える
17

Facebookの Railscast のコードを適合させて、有効期間の短いトークンを 60 日間のトークンに交換する方法を示すこの投稿に出くわしました。

user.rb

 def self.from_omniauth(auth)

    # immediately get 60 day auth token
    oauth = Koala::Facebook::OAuth.new(ENV["FACEBOOK_APP_ID"], ENV["FACEBOOK_SECRET"])
    new_access_info = oauth.exchange_access_token_info auth.credentials.token

    new_access_token = new_access_info["access_token"]
    # Facebook updated expired attribute
    new_access_expires_at = DateTime.now + new_access_info["expires_in"].to_i.seconds

    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.image = auth.info.image
      user.email = auth.info.email
      user.oauth_token = new_access_token #originally auth.credentials.token
      user.oauth_expires_at = new_access_expires_at #originally Time.at(auth.credentials.expires_at)
      user.save!
    end
  end
于 2013-05-23T18:54:01.787 に答える