8

ユーザーが自分のFacebookアカウントをリンクできるアプリケーションがあります。メールを使用してログインできますが、Facebookアカウントをリンクすることはできます。

リンクされたソーシャルネットワーク(Facebookなど)を表示すると、次のようになります。

<%= image_tag @facebook.get_facebook_picture %>

これにより、次のようなインスタンスメソッドが呼び出されます。

def get_facebook_picture
    unless self.token.nil?
      facebook_graph = Koala::Facebook::GraphAPI.new(self.token)
      fb_picture = facebook_graph.get_picture("me", { :type => "small" })
    end
end

これは、DBに保存したFacebookトークンの有効期限が切れていない限りうまく機能します。したがって、前述のコントローラーにこの例外ハンドラーを追加しました。

def facebook_exception_handler exception
    if exception.fb_error_type.eql? 'OAuthException'
      # Let's get a new auth token... How?
    else
      logger.debug "Damn it. We don't know what error is coming from FB"
      raise exception
    end
end

例外を正しくキャッチしましたが、データベースにあるアクセストークンをどのように更新するのかわかりません。OmniAuthを使用して挿入されたアクセストークンに注意してください。だから私の質問は:

を持っている場合、 OmniauthOAuthExceptionを使用して特定のユーザー(UID)のアクセストークンを更新するにはどうすればよいですか?

4

2 に答える 2

9

単純なケースは、最初に承認したとおりに、FB でユーザーを再認証することです。そもそもトークンを取得するには、FB に対して認証するために omniauth (および onmiauth-facebook) を使用していると想定しています。つまり、auth コールバックを処理するためのルートとコントローラー アクション、およびトークンをデータベースに挿入する関数が用意されています。

omn​​iauth で最初に取得したアクセス トークンは、さまざまな理由 (期限切れ、またはユーザーが FB パスワードを変更したなど) で無効になる可能性があります。そのような場合、別の OAuth 呼び出しで有効なトークンが返されます。(最初にユーザーを認証したときと同じように) もう一度呼び出して、無効なトークンを DB 内の新しいトークンに置き換えるだけで問題ありません。

この要点(ここで尋ねた関連する質問に対する私自身の回答)には、それをカバーするコードがいくつかありますが、すでにカバーされているようです。十分な状態を保存してから、例外をトリガーしたものを再試行すれば問題ありません。

また、ユーザーが FB アプリの設定を変更してアプリの認証を解除したため、トークンが無効になっている可能性もあります。その場合、ユーザーには、FB に対して初めて認証する新しいユーザーであるかのように、FB 権限ダイアログが表示されます。( FB )

それは理にかなっていますか?

于 2012-04-17T06:17:15.137 に答える
2

これで RailsCasts koala チュートリアル接続を変更できます:

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:56:40.877 に答える