除了“无”之外什么都没有。当我打开“OAuth 2.0 for Canvas”时,为我的 Python web.py Facebook 应用程序返回

发布于 2024-11-08 17:29:17 字数 2524 浏览 1 评论 0原文

我是一名 Facebook 应用开发新手,但我是一名经验丰富的开发人员。我使用 web.py 作为我的 Web 框架,更糟糕的是,我是 Python 新手。

我遇到了一个问题,当我尝试切换到使用较新的“OAuth 2.0 for Canvas”时,我根本无法让任何东西工作。我的 Facebook 应用程序中唯一返回的内容是“无”。

我开启 OAuth 2.0 的动机是因为听起来 Facebook 将在 7 月之前强制启用它,我不妨现在就学习它,但现在必须在几周内重写它。

我在高级设置中打开了“OAuth 2.0 for Canvas”,并重写了我的代码以查找每当我的测试用户尝试访问我的应用程序时发布到我的服务器的“signed_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 的页面。同样,我发现了许多很好的博客和 stackoverflow 问题,它们准确地记录了如何使用 OAuth 2.0 和signed_request。但事实上,我得到了一个正确的 oauth_token,但我唯一的输出是“无”,这让我认为我做错了一些基本的事情。我意识到“None”在Python中是一个特殊的词,所以也许这就是原因,但我无法确切地确定我做错了什么。

当我关闭 OAuth 2.0 并恢复代码以查找较旧的 POST 数据时,我可以轻松地将内容打印到屏幕上。

对此的任何帮助将不胜感激!

I am a beginning Facebook app developer, but I'm an experienced developer. I'm using web.py as my web framework, and to make matters a bit worse, I'm new to Python.

I'm running into an issue, where when I try to switch over to using the newer "OAuth 2.0 for Canvas", I simply can't get anything to work. The only thing being returned in my Facebook app is "None".

My motivation for turning on OAuth 2.0 is because it sounds like Facebook is going to force it by July, and I might as well learn it now and now have to rewrite it in a few weeks.

I turned on "OAuth 2.0 for Canvas" in the Advanced Settings, and rewrote my code to look for "signed_request" that is POSTed to my server whenever my test user tries to access my app.

My code is the following (I've removed debugging statements and error checking for brevity):

#!/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()

For the time being, I want to concentrate on the case where the user is already logged in, so assume that oauth_token is found.

My question is: Why is my "Hello" not being outputted, and instead all I see is "None"?

It appears that I'm missing something very fundamental, because I swear to you, I've scoured the Internet for solutions, and I've read the Facebook pages on this many times. Similarly, I've found many good blogs and stackoverflow questions that document precisely how to use OAuth 2.0 and signed_request. But the fact that I am getting a proper oauth_token, but my only output is "None" makes me think there is something fundamental that I'm doing incorrectly. I realize that "None" is a special word in python, so maybe that's the cause, but I can't pin down exactly what I'm doing wrong.

When I turn off OAuth 2.0, and revert my code to look for the older POST data, I'm able to easily print stuff to the screen.

Any help on this would be greatly appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凶凌 2024-11-15 17:29:17

多尴尬啊!

在我的授权函数中,我返回一个字符串。但由于类索引正在调用授权,因此它需要从类返回,而不是从授权返回。如果我返回授权的回报,它就有效。

How embarrassing!

In my authorize function, I return a string. But since class index is calling authorize, it needs to be returned from the class, not from authorize. If I return the return from authorize, it works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文