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