facebook-oauthの現在の純粋なpythonソリューションですか?

私は、OAuth 2.0サーバサイドのソリューションのために、javascriptを完全に避けようとしている唯一の人ではなかったようです。人々はすべてを行うことができましたが、ログアウトできませんでした:

FacebookのOauthログアウト

FacebookグラフAPIを使用したOauthログアウト

FacebookのOAuth2ログアウトでfb_クッキーが削除されない

FacebookでのOAuth 2.0の公式ドキュメントには次のようなものがあります:

You can log a user out of their Facebook session by directing them to the following URL:

https://www.facebook.com/logout.php?next=YOUR_URL&access_token=ACCESS_TOKEN

YOUR_URL must be a URL in your site domain, as defined in the Developer App.

I wanted to do everything serverside and I found that the suggested way to link leaves the cookie so that the logout link doesn't work: https://www.facebook.com/logout.php?next=http://{{host}}&access_token={{current_user.access_token}} It does redirect but it doesn't log the user out of my website. It seemed like a Heisenbug since this was changing to me and there was not much documentation. I anyway seemed to be able to achieve the functionality with a handler that manipulates the cookie so that in effect the user is logged out:

class LogoutHandler(webapp2.RequestHandler):
    def get(self):
        current_user = main.get_user_from_cookie(self.request.cookies, facebookconf.FACEBOOK_APP_ID, facebookconf.FACEBOOK_APP_SECRET)
        if current_user:
          graph = main.GraphAPI(current_user["access_token"])
          profile = graph.get_object("me")
          accessed_token = current_user["access_token"] 
        self.set_cookie("fbsr_" + facebookconf.FACEBOOK_APP_ID, None, expires=time.time() - 86400)
        self.redirect("https://www.facebook.com/logout.php?next=http://%s&access_token=%s" get_host(), accessed_token)
    def set_cookie(self, name, value, expires=None):
        if value is None:
            value = 'deleted'
            expires = datetime.timedelta(minutes=-50000)
        jar = Cookie.SimpleCookie()
        jar[name] = value
        jar[name]['path'] = '/'
        if expires:
            if isinstance(expires, datetime.timedelta):
                expires = datetime.datetime.now() + expires
            if isinstance(expires, datetime.datetime):
                expires = expires.strftime('%a, %d %b %Y %H:%M:%s')
            jar[name]['expires'] = expires
        self.response.headers.add_header(*jar.output().split(': ', 1))
    def get_host(self):
        return os.environ.get('HTTP_HOST', os.environ['SERVER_NAME'])

だから、ハンドラーを/ auth/logoutにマッピングし、これをリンクに設定すると、ユーザーは自分のサイトからログアウトされます(ただし、うまくいけば、テストされていないこともあります)

私のコードの他の部分はOauth通信のためのOAuthトークンとクッキーの参照を扱っています:

def get(self):
    fbuser=None
    profile = None
    access_token = None
    accessed_token = None
    logout = False
    if self.request.get('code'):
      args = dict(
        code = self.request.get('code'),
        client_id = facebookconf.FACEBOOK_APP_ID,
        client_secret = facebookconf.FACEBOOK_APP_SECRET,
        redirect_uri = 'self.get_host()/',
      )
      file = urllib.urlopen("https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args))
      try:
        token_response = file.read()
      finally:
        file.close()
      access_token = cgi.parse_qs(token_response)["access_token"][-1]
      graph = main.GraphAPI(access_token)
      user = graph.get_object("me")   #write the access_token to the datastore
      fbuser = main.FBUser.get_by_key_name(user["id"])
      logging.debug("fbuser "+fbuser.name)

      if not fbuser:
        fbuser = main.FBUser(key_name=str(user["id"]),
                            id=str(user["id"]),
                            name=user["name"],
                            profile_url=user["link"],
                            access_token=access_token)
        fbuser.put()
      elif fbuser.access_token != access_token:
        fbuser.access_token = access_token
        fbuser.put()

    current_user = main.get_user_from_cookie(self.request.cookies, facebookconf.FACEBOOK_APP_ID, facebookconf.FACEBOOK_APP_SECRET)
    if current_user:
      graph = main.GraphAPI(current_user["access_token"])
      profile = graph.get_object("me")
      accessed_token = current_user["access_token"]

私はloginhandlerを作っていませんでした。ログインは基本的に上記のルートリクエストハンドラのコードです。私のユーザークラスは次のとおりです:

class FBUser(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    profile_url = db.StringProperty()
    access_token = db.StringProperty(required=True)
    name = db.StringProperty(required=True)
    picture = db.StringProperty()
    email = db.StringProperty()

私は2つの基本的なプロバイダを嘲笑した ここに画像の説明を入力してください 私はfacebookユーザーの変数current_userと、ログインしているCookieと一致しないユーザーのGoogleユーザーと変数fbuserの変数userを使用します。

8
あなたのウェブサイトからユーザーをログアウトさせることは、あなた次第です。ログインの詳細を追跡するために使用しているセッションを削除するだけで済みます。外部APIはどのようにしますか?
追加された 著者 Nick Johnson,
また、ええと、質問は何ですか?あなたはあなたがしたことを説明しているようです。
追加された 著者 Nick Johnson,
offline_accessパーミッションを要求しない限り、デフォルトトークンの有効期限は2時間です。
追加された 著者 Alvin K.,

1 答え

私は、あなた自身のためにあなたのウェブサイト上の認証を追跡することを意味していると信じています。 あなたのサイトのCookieを自分で設定解除する必要があります。

たいていの場合、Facebookトークンがオフラインアクセストークンではなく、セッション専用トークンであれば、それは無効になります。

2
追加された