Ничего, кроме None, не возвращалось для моего приложения Python web.py Facebook, когда я включаю OAuth 2.0 для Canvas

Я начинающий разработчик приложений для 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, я смогу легко выводить данные на экран.

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


person kjackson    schedule 23.05.2011    source источник


Ответы (1)


Как неловко!

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

person kjackson    schedule 24.05.2011