2011-05-23 55 views
1

我是一名Facebook應用程序開發人員,但我是一名經驗豐富的開發人員。我使用web.py作爲我的web框架,並且讓事情變得更糟,我是Python的新手。當我打開「Canvas 2.0 OAuth 2.0」時,我的Python web.py Facebook應用程序返回的「None」沒有任何結果

我遇到了一個問題,當我嘗試切換到使用較新的「Canvas 2.0 OAuth 2.0」時,我根本無法獲得任何工作。在我的Facebook應用程序中返回的唯一東西是「無」。

我開啓OAuth 2.0的動機是因爲它聽起來像Facebook將在7月份推出它,現在我不妨瞭解它,現在不得不在幾個星期內重寫它。

我在高級設置中打開了「Canvas的OAuth 2.0」,並重寫了我的代碼以查找「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。

我的問題是:爲什麼我的「你好」沒有被輸出,而是我看到的只是「無」?

看來我錯過了一些非常基本的東西,因爲我向你發誓,我已經在互聯網上尋找解決方案,而且我已經閱讀過很多次這樣的Facebook頁面。同樣,我發現了許多很好的博客和stackoverflow問題,可以準確記錄如何使用OAuth 2.0和signed_request。但是我得到了一個合適的oauth_token,但是我唯一的結果是「無」,這讓我覺得有一些根本性的錯誤。我意識到「無」是python中的一個特殊詞,所以也許這就是原因,但我不能確切地說明我做錯了什麼。

當我關閉OAuth 2.0並恢復代碼以查找舊的POST數據時,我可以輕鬆地將東西打印到屏幕上。

任何幫助,將不勝感激!

回答

0

多麼尷尬!

在我的授權函數中,我返回一個字符串。但是,因爲類索引正在調用授權,所以需要從類中返回,而不是從授權中返回。如果我從授權返回返回,它將起作用。

相關問題