Я начинающий разработчик приложений для Facebook, но я уже опытный разработчик. Я использую web.py в качестве веб-фреймворка, и, что еще хуже, я новичок в Python.
Я столкнулся с проблемой, из-за которой, когда я пытаюсь переключиться на более новый «OAuth 2.0 для Canvas», я просто не могу заставить что-либо работать. Единственное, что возвращается в моем приложении Facebook, это «Нет».
Моя мотивация для включения OAuth 2.0 заключается в том, что похоже, что Facebook собирается заставить его к июлю, и я мог бы также изучить его сейчас, и теперь мне придется переписывать его через несколько недель.
Я включил «OAuth 2.0 для Canvas» в дополнительных настройках и переписал свой код для поиска «signed_request», который отправляется на мой сервер POST всякий раз, когда мой тестовый пользователь пытается получить доступ к моему приложению.
Мой код выглядит следующим образом (для краткости я удалил операторы отладки и проверку ошибок):
#!/usr/bin/env python
import base64
import web
import minifb
import urllib
import json
FbApiKey = "AAAAAA"
FbActualSecret = "BBBBBB"
CanvasURL = "http://1.2.3.4/fb/"
RedirectURL="http://apps.facebook.com/CCCCCCCC/"
RegURL = 'https://graph.facebook.com/oauth/authorize?client_id=%s&redirect_uri=%s&type=user_agent&display=page' % (FbApiKey, RedirectURL)
urls = (
'/fb/', 'index',
)
app = web.application(urls, locals())
def authorize():
args = web.input()
signed_request = args['signed_request']
#split the signed_request via the .
strings = signed_request.split('.')
hmac = strings[0]
encoded = strings[1]
#since uslsafe_b64decode requires padding, add the proper padding
numPads = len(encoded) % 4
encoded = encoded + "=" * numPads
unencoded = base64.urlsafe_b64decode(str(encoded))
#convert signedRequest into a dictionary
signedRequest = json.loads(unencoded)
try:
#try to find the oauth_token, if it's not there, then
#redirect to the login page
access_token = signedRequest['oauth_token']
print(access_token)
except:
print("Access token not found, redirect user to login")
redirect = "<script type=\"text/javascript\">\ntop.location.href=\"" +_RegURL + "\";\n</script>"
print(redirect)
return redirect
# Do something on the canvas page
returnString = "<html><body>Hello</body></html>"
print(returnString)
class index:
def GET(self):
authorize()
def POST(self):
authorize()
if __name__ == "__main__":
app.run()
Пока я хочу сосредоточиться на случае, когда пользователь уже вошел в систему, поэтому предположим, что найден oauth_token.
Мой вопрос: почему мое «Привет» не выводится, а вместо этого я вижу только «Нет»?
Похоже, я упускаю что-то очень фундаментальное, потому что, клянусь вам, я рыскал в Интернете в поисках решений и много раз читал об этом страницы Facebook. Точно так же я нашел много хороших блогов и вопросов о stackoverflow, в которых точно описано, как использовать OAuth 2.0 и signed_request. Но тот факт, что я получаю правильный oauth_token, но мой единственный вывод «Нет», заставляет меня думать, что есть что-то фундаментальное, что я делаю неправильно. Я понимаю, что «Нет» — это специальное слово в питоне, так что, возможно, это причина, но я не могу точно определить, что я делаю неправильно.
Когда я отключу OAuth 2.0 и верну свой код для поиска старых данных POST, я смогу легко выводить данные на экран.
Любая помощь по этому вопросу будет принята с благодарностью!