4

期限切れのトークンに関するこの質問が何度も寄せられていることは知っています。しかし、自分の状況に合うものを見つけることができませんでした。基本的には、ユーザーが Facebook でオンラインかオフラインかに関係なく、ユーザーに fb apprequest を作成したいと考えています。

また、私は Facebook のドキュメントと混同しています。誰かが私が以下に持っている質問に答えることができれば感謝します.

  • Facebook のアクセス トークンは、ユーザーが Facebook からサインアウトした直後に有効期限が切れます。

  • Say user アクセス トークンの有効期限が切れています。ユーザー A がキャンバス アプリケーションに戻らずに、新しいアクセス トークンを取得することはできますか?

  • ユーザーを認証するときに、必要に応じて有効期間を延長できる短命のトークンを取得しますか、それともデフォルトで長命のトークンを取得しますか?

以下は、Koala を使用して fb リクエストを行うために使用するコードです。

begin
  graph = Koala::Facebook::API.new(access_token)
  graph.put_object("me", "apprequests", {:message => "..."})
rescue Koala::Facebook::APIError
  # Assume a user has a short-lived token and hasn't visit my application for a long time. 
  # Is it possible to get a NEW long-lived token here without the user going to my application again 
  # (assume the user did not remove my application) ? If Yes, how to do that using Koala ?
end

ありがとう!

4

5 に答える 5

3

Facebook のアクセス トークンは、ユーザーが Facebook からサインアウトした直後に有効期限が切れます。

はい。

Say user アクセス トークンの有効期限が切れています。ユーザー A がキャンバス アプリケーションに戻らずに、新しいアクセス トークンを取得することはできますか?

新しいトークンを取得するには、ユーザーが何らかの方法でアプリを操作する必要があります。そのインタラクションは、実際のキャンバス ページにアクセスする必要はありません。アクセスしているページで FB.getLoginStatus を呼び出すこともできます。

ユーザーを認証するときに、必要に応じて有効期間を延長できる短命のトークンを取得しますか、それともデフォルトで長命のトークンを取得しますか?

サーバー側の認証を行っている場合は、長寿命の認証が得られます。クライアント側でそれを行うと、短命のトークンが得られ、それを長命のトークンと交換できます。

しかし、それはすべてここで明確に説明されています: https://developers.facebook.com/roadmap/offline-access-removal/

于 2012-06-07T06:02:10.553 に答える
2

これでレールキャストコアラチュートリアル接続を変更できます:

def facebook
  if self.facebook_expires_at < Time.now
    oauth = Koala::Facebook::OAuth.new(ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"])
    new_access_info = oauth.exchange_access_token_info self.facebook_token

    new_access_token = new_access_info["access_token"]
    new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds

    self.update_attributes!(:facebook_token => new_access_token,
                          :facebook_expires_at => new_access_expires_at )
  end
  @facebook ||= Koala::Facebook::API.new(self.facebook_token)
  block_given? ? yield(@facebook) : @facebook

  rescue Koala::Facebook::APIError => e
    logger.info e.to_s
    nil
end
于 2014-01-24T04:51:55.563 に答える
0

これは私も対処しなければならなかった問題です。認証トークンの有効期限が切れる認証のために、Devise を使用して Facebook ユーザーからユーザーを作成しています。トークンの有効期限が切れると、ユーザーにアプリの再承認を求めることなくトークンを更新する方法はありません。したがって、私の場合、認証レコードを破棄するだけで済み、ユーザーは再認証する必要があります。救助は何かに見えます:

  rescue Koala::Facebook::APIError => e
    if e.message.include?("OAuthException: Error validating access token:")
      Rails.logger.error "Facebook access token not valid for: #{my_model.facebook_authentication} with #{e}"
      my_model.facebook_authentication.destroy
    else
      Rails.logger.error "FacebookApi#perform Koala Error with #{e}, model_id:#{model.id}"
    end
  end

これが少なくとも途中で役立つことを願っています。別の解決策に出くわした場合は、興味を持ってください。

于 2012-06-07T04:55:44.830 に答える
0

ユーザーがFacebook経由でサインインするときに、DBのトークンを更新するだけです。ユーザーがサインインして DB を更新するたびに、HASH からトークンを取得し、トークンを更新します。これにより、無期限のトークンを取得できます。私は今日それをしましたが、それも機能しています。

于 2014-01-30T12:40:39.940 に答える