Ничего, кроме «None», не вернулось для моего приложения Facebook на Python web.py при включении «OAuth 2.0 для Canvas» - PullRequest
1 голос
/ 23 мая 2011

Я начинающий разработчик приложений для Facebook, но я опытный разработчик.Я использую web.py в качестве веб-фреймворка, и, что еще хуже, я новичок в Python.

Я сталкиваюсь с проблемой, когда при попытке перейти на использованиеболее новый "OAuth 2.0 для Canvas", я просто не могу заставить что-либо работать.Единственное, что возвращается в моем приложении Facebook, это «Нет».

Моя мотивация для включения OAuth 2.0 заключается в том, что похоже, что Facebook заставит его к июлю, и я мог бы также изучить его сейчас иТеперь придется переписать его через несколько недель.

Я включил «OAuth 2.0 для Canvas» в расширенных настройках и переписал свой код для поиска «signature_request», которое отправляется на мой сервер всякий раз, когда мой тестовый пользователь пытается получить доступ к моему приложению.

Мой код следующий (я удалил отладочные операторы и проверку ошибок для краткости):

#!/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 найден.

Мой вопрос таков: почему не выводится «Hello», а вместо этого отображается только «None»?

Похоже, что я пропалчто-то очень фундаментальное, потому что, клянусь вам, я искал в Интернете решения, и я много раз читал об этом на страницах Facebook.Точно так же я нашел много хороших блогов и вопросов о стековом потоке, которые точно описывают, как использовать OAuth 2.0 и signature_request.Но тот факт, что я получаю правильный oauth_token, но мой единственный вывод - «None», заставляет меня думать, что есть что-то фундаментальное, что я делаю неправильно.Я понимаю, что "None" - это особое слово в python, поэтому, возможно, в этом причина, но я не могу точно определить, что я делаю неправильно.

Когда я выключаю OAuth 2.0 и возвращаю свойкод для поиска старых данных POST, я могу легко напечатать материал на экран.

Любая помощь по этому вопросу будет принята с благодарностью!

1 Ответ

0 голосов
/ 24 мая 2011

Как неловко!

В моей функции авторизации я возвращаю строку. Но поскольку индекс класса вызывает authorize, его нужно возвращать из класса, а не из authorize. Если я верну возврат из авторизации, это сработает.

...