8

Belirli bir kullanıcının facebook kimliğini kaydetmek istiyorum, böylece Facebook üzerinden daha fazla materyal alabiliyorum. İdeal olarak ne javascript ne de cookie kullandığını, sadece server olarak ne de bir örnek olduğunu, sadece yol tarifi olmadığını, yani tartışabileceğimiz bir araya getirdiğim bir çözüm istiyorum. Yani birlikteFacebook OAuth 2.0 tamamen sunucu nasıl etkinleştirilir?

class OAuthHandler(webapp2.RequestHandler): 
    def get(self): 
     args = dict(
     code = self.request.get('code'), 
     client_id = facebookconf.FACEBOOK_APP_ID, 
     client_secret = facebookconf.FACEBOOK_APP_SECRET, 
     redirect_uri = 'http://www.koolbusiness.com/oauth', 
    ) 
     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 = facebook.GraphAPI(access_token) 
     user = graph.get_object("me") 
     self.response.out.write(user["id"]) 
     self.response.out.write(user["name"]) 

:

https://www.facebook.com/dialog/oauth?client_id=164355773607006&redirect_uri=http://www.kewlbusiness.com/oauth

Sonra userData almak için bu gibi ele: Ben sadece web sitesi için OAuth iletişim kutusuna bir kullanıcı bağladığınızda İşte eserlerini düşünmek kod Bu web sitem için "facebook ile giriş yapabilirim" diye bir sürü dağınık javascript ve istediğimiz çerezleri kullanamam. Web sitem için "Facebook ile giriş yap" özelliğini etkinleştirmek istedim. Çerez olmadan ve javascript olmadan çalışmalı, ancak yapmaya çalıştıkları ilk şey Javascript ve çerezlerdir. Bu yüzden çerez olmadan ve javascript olmadan çalışacak bir çözüm yaptım, sadece OAuth 2.0: "Çözümüm" hakkında bir şey söyleyebilir misin? Aradığım pratik kullanım, FB kullanıcısının web sitemde ne yaptığı ve facebook hesaplarının standart hale getirildiği şekilde oturum açmak için kullandığı basit işlevi etkinleştirmektir.

Sadece javascript SDK'siz ve çerezsiz çalışmalı ve durum böyle görünüyor. Bu "çözüm" ile benim avantajlarımın ve dezavantajlarımın neler olduğunu söyleyebilir misiniz? Bence Javascript + Cookie'den çok daha iyi, öyleyse en az örnek% 100 serveride olduğu zaman neden javascript ve cookie kullanmak için bizi kandırıyorlar?

teşekkür ederiz

Doğru görünüyor ve sağ davranır ve ben de hiçbir JavaScript ve hiçbir çerez, sadece piton ile ön sayfaya datatore ile userData kullanmak ve benim FB adını işleyebilen Güncelleme:

bir google kullanıcı için bir facebook kullanıcısı için değişken fbuser ve değişken kullanıcıyı sahip
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() 
    friends = db.StringListProperty() 
    dirty = db.BooleanProperty() 

class I18NPage(I18NHandler): 

    def get(self): 
    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 = 'http://www.kewlbusiness.com/', 
     ) 
     logging.debug("client_id"+str(args)) 
      file = urllib.urlopen("https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args)) 
      try: 
     logging.debug("reading file") 
      token_response = file.read() 
     logging.debug("read file"+str(token_response)) 
      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 "+str(fbuser)) 

      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() 
      self.render_jinja(
       'home_jinja',request=self.request,fbuser=user,... 

şimdi arabası dağınık gereksiz javascript + cookie olmadan benim web sitesi için facebook kullanmayı beni kabul ediyor.

Artık facebook adımı web sitemden görüntüleyebilir ve görüntüleyebilirim. Bu, nihayetinde javascript içermemesi ve çerezlere ihtiyaç duymadığı şekilde çalışıyor.

Sunucular OAuth 2.0 en temiz çözüm olduğunda belgeler neden javascript + cookie'yi öneriyor? Javascript veya çerez kullanıyorsanız, buna bağlı olmadığı için bunun en iyi çözüm olduğuna katılıyor musunuz?

Güncelleme Olası Şimdi diğer adamlar sunucu kodu ile oturumu olamayacağını gördük yinelenen soru, bunlar JavaScript SDK başvurmak zorunda kaldı ve bir şartı ve hiçbir javascript ile çalışması gerektiğini gerektiğini olabilir Bu yüzden bazı hata ayıklama yaptım ve kuralı "temizlemenin" ve çerezin adını değiştirmem gerektiğini ve çalışmamı sağladığını düşündüm. Yorumunuzu ve/veya projemin bunu nasıl çözdüğünü düşündüğünüzü test ediyorum. Bunun gibi bir çıkış linki çalışmalı, ancak çalışmıyor. Bu Bunu düzeltmek olabilir ama yine de çıkış 2. bir vuruş gerektiren yapar bilmiyorum çünkü garip bir hata olduğunu neden iki kez Oturumu çalıştığını ve bu buysa: Ben değildi gibi

https://www.facebook.com/logout.php?next=http://www.myappengineproject.com&access_token=AAACVewZBArF4BACUDwnDap5OrQQ5dx0jsHEKPJkIJJ8GdXlYdni5K50xKw6s8BSIDZCpKBtVWF9maHMoJeF9ZCRRYM1zgZD

görünüyor OAuth 2.0 sunucu ile bir çözüm için javascript'i tamamen engellemeye çalışan tek kişi.İnsanlar her şeyi yapabileceği ama çıkış olamazdı:

Facebook Oauth Logout

Facebook ile OAuth 2.0 için resmi belgelerine diyor ki: Sen yönlendirerek onların Facebook oturumu dışında bir kullanıcı oturum açabilir

aşağıdaki URL:

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

your_URL sitenizin doma bir URL olmalıdır Geliştirici Uygulamasında tanımlandığı gibi.

her şeyi serverside yapmak istedim ve çıkış bağlantısını çalışmıyor böylece bağlantı önerilen yolu çerez bırakır bulundu: https://www.facebook.com/logout.php?next=http://{{host}}&access_token={{current_user.access_token}} O yönlendiriyor ama kullanıcıya bizim günlüğünü gelmez internet sitem. Bu bana bir Heisenbug gibi geldi çünkü bu bana değişiyordu ve fazla dokümantasyon yoktu.

class LogoutHandler(webapp2.RequestHandler): 
    def get(self): 
     self.set_cookie("fbsr_" + facebookconf.FACEBOOK_APP_ID, None, expires=time.time() - 86400) 
     self.redirect("/") 
    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)) 

Yani/auth/oturum kapatma işleyicisi haritalama ve etkin bağlantıya bu ayarı: yürürlükte kullanıcının oturumu böylece yine çerez işleyen bir işleyicisi ile işlevselliği elde etmek mümkün görünüyordu

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 = 'http://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"] 

: kodumu diğer bazı bölümleri Oauth iletişim için OAuth göstergelerini ve çerez aramalarını işleyen

(umarım, facebook üzerinden kullanıcıyı yapıp denenmemiş olmadan) benim siteden kullanıcıyı kaydeder Ben bir loginha yapmadım Giriş yapabildiğimden beri ndler root istek işleyicimde yukarıdaki kod.

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() 

Ben birlikte iki temel sağlayıcılarından enter image description here Ve facebook kullanıcı ve google kullanıcı için değişken kullanıcı ve bir kullanıcı için değişken fbuser için değişken örnein kullanmak alay şu şekildedir: Benim kullanıcı sınıftır giriş yapmak ve bu nedenle çerez eşleşmesi yoktur.

kullandığım çerez arama kodu şudur ve ben bunu anlıyorum ve ne istiyorum yaptığı:

def get_user_from_cookie(cookies, app_id, app_secret): 
    """Parses the cookie set by the official Facebook JavaScript SDK. 

    cookies should be a dictionary-like object mapping cookie names to 
    cookie values. 

    If the user is logged in via Facebook, we return a dictionary with the 
    keys "uid" and "access_token". The former is the user's Facebook ID, 
    and the latter can be used to make authenticated requests to the Graph API. 
    If the user is not logged in, we return None. 

    Download the official Facebook JavaScript SDK at 
    http://github.com/facebook/connect-js/. Read more about Facebook 
    authentication at http://developers.facebook.com/docs/authentication/. 
    """ 
    logging.debug('getting user by cookie') 
    cookie = cookies.get("fbsr_" + app_id, "") 
    if not cookie: 
     logging.debug('no cookie found') 
     return None 
    logging.debug('cookie found') 
    response = parse_signed_request(cookie, app_secret) 
    if not response: 
     logging.debug('returning none') 
     return None 

    args = dict(
     code = response['code'], 
     client_id = app_id, 
     client_secret = app_secret, 
     redirect_uri = '', 
    ) 

    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] 
    logging.debug('returning cookie') 
    return dict(
     uid = response["user_id"], 
     access_token = access_token, 
    ) 

Bunu çözmek için çerezleri öğrenmek zorunda kaldı ve ben daha yorum yapabilirsiniz umuyoruz. hoşgeldin mesajı 3 değişken, google kullanıcı için bir tane, facebook kullanıcı ve cevapta belirtildiği durum için değişken fbuser oturum için bir tane gerekli çıktısı:

JavaScript/Çerezler bir kimlik doğrulaması çalışırken kullanılır Yeni kullanıcı. Veritabanınızda mevcut değil ve accessToken ürününe sahip değilsiniz.

Yani 3 değişken kullanmak zorundaydım, belki sadece 2 değişkenle yapabilirsiniz? Yeni bir kullanıcının kimliğini doğrulamaya çalıştığınızda, JavaScript/Çerezler kullanılır.

cevap

1

Bu sizin veritabanınızda bulunmuyor ve onun accessToken'ına sahip değilsiniz.

Kullanıcı erişiminiz olduğunda, Facebook API'sine dilediğinizde, herhangi bir programlama dilinden HTTP üzerinden, çerezler/javascript olmadan erişebilirsiniz. Python istemcisi vardır, örneğin: http://github.com/pythonforfacebook/facebook-sdk (https://github.com/facebook/python-sdk)

+0

Bağlantı için teşekkürler. Bu örnek iyiydi, çünkü ben OAuth'u arıyordum ve çerezlerin oturum yönetimi için kullanıldığını anlıyorum. Ben her şey benim oturumu dışında çalışır düşünüyorum ve örnek çok uygun bir logouthandler sağlar diğer insanlar bu javascript olmadan bunu yapmak için çalıştı ve karmaşık buldum –

+0

Benim için çalışıyor ve bu bana uyardı son bileşeni oldu (çıkış Yap). Facebook tarafından sağlanan bağlantı çerezleri temizlemez, böylece kullanıcılar oyuna geç –

+1

Oyuna geç kalırlar. Ancak bu bağlantı bozuk görünüyor. Güncellenmiş olan: https://github.com/pythonforfacebook/facebook-sdk/ – damzam

1

Bunu bulundu. Çok iyi görünüyor ve sadece fb'den daha fazlasını sunuyor. https://code.google.com/p/gae-simpleauth/

+1

Bugün kullandığım işte bu da foursquare ile çalışıyor. Sitemi, başka bir sağlayıcı eklediğim şekilde ekleyebilmem için bir Oauth sağlayıcısı olmaya çalışmayı düşünüyorum. Birçok farklı kullanıcı modeli yapmak için dezavantajlıydı, ama şimdi webapp2'nin kullanıcı modelini kullanabileceğimiz bir 'ndb.Expando'dur' diyebileceğimiz simpleauth'u geliştirebiliyoruz, böylece yeni bir uygulama yinelemesini bile reddetmeksizin bir sağlayıcı ekleyebiliriz, benim fikrim sağlayıcı verilerini bir yönetici web bölümünden ekleyebilmeniz için veri sağlayıcıdaki verileri saklar. –

+0

İlginç. Bunun nasıl gittiğini bize bildirin. –