#python #google-app-engine #facebook-oauth
#python #google-app-engine #facebook-oauth
Вопрос:
Я пытаюсь использовать новый файл cookie fbsr_{{AppID}}.
Я использую следующие функции для его анализа, но когда я пытаюсь получить access_token впоследствии, я получаю сообщение «ошибка проверки кода подтверждения». Что-то не так с этими функциями синтаксического анализа? Если нет, в чем может быть проблема?
дополнительная информация: мне удалось войти в систему пользователей без файлов cookie, используя ссылку oauth, которая перенаправляет обратно на мой сайт с кодом в качестве параметра, поэтому это не может быть идентификатор приложения, секрет приложения или redirect_uri. Другая причина заключается в том, что они имеют разные сообщения об ошибках.
def base64_url_decode(inp):
padding_factor = (4 - len(inp) % 4) % 4
inp = "="*padding_factor
return base64.b64decode(unicode(inp).translate(dict(zip(map(ord, u'-_'), u' /'))))
def parse_signed_request(signed_request, secret):
l = signed_request.split('.', 2)
encoded_sig = l[0]
payload = l[1]
sig = base64_url_decode(encoded_sig)
data = json.loads(base64_url_decode(payload))
if data.get('algorithm').upper() != 'HMAC-SHA256':
logging.error('Unknown algorithm')
return None
else:
expected_sig = hmac.new(secret, msg=payload, digestmod=hashlib.sha256).digest()
if sig != expected_sig:
return None
else:
logging.debug('valid signed request received..')
return data
args = {}
args['client_id'] = fbapp_id
args['redirect_uri'] = site_url
args['client_secret'] = fbapp_secret
args['code'] = code
response = urllib.urlopen('https://graph.facebook.com/oauth/access_token?' urllib.urlencode(args))
# ... here i'm getting the error back from the server: error validating verification code...
Ответ №1:
Существует модифицированная версия facebook python SDK, которая поддерживает OAuth 2.0 и синтаксический анализ файла cookie fbsr_ на github здесь:
https://gist.github.com/1190267
Вы можете заглянуть в код, чтобы узнать, как разобрать файл cookie, или просто позволить этому файлу сделать всю работу за вас.
Комментарии:
1. Спасибо, Шон, это устранило проблему для меня. Конечно, было бы неплохо, если бы «официальный» python SDK обрабатывал оба случая (oauth, не-oauth).
2. Я думаю, что лучшее место для получения facebook. файл py должен перейти в официальную библиотеку Facebook для python здесь: github.com/facebook/python-sdk/network . Поскольку он устарел, вы должны выбрать один из его последних форков и использовать его. Пример от Sean M плохой, используя его, вы будете каждый раз подключаться для проверки своего файла cookie, который уже исправлен, например, в форке pythonforfacebook
Ответ №2:
Мне пришлось программно удалить файл cookie, чтобы мой выход из системы работал. Ссылка с facebook не работает, но серверный oauth может выполнить выход из системы без javascript:
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))
Не могли бы вы обновить свой вопрос, чтобы рассказать нам, как все прошло и как мы обрабатываем файлы cookie. Для facebook-oath у вас сработал выход из системы? Мне пришлось добавить обработку файлов cookie и обработчик выхода из системы, чтобы это работало для меня, но теперь, после долгих поисков и устранения неполадок, это работает. Я вхожу в систему следующим образом:
class OAuthHandler(I18NHandler):
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 = main.GraphAPI(access_token)
user = graph.get_object("me")
self.response.out.write(user["id"])
self.response.out.write(user["name"])
def get(self):
fbuser=None
profile = None
access_token = None
accessed_token = None
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() '/',
)
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 " 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"]