2011-09-01 33 views
0

使用的Dropbox API的我使用的oauth2包dropbox來Django的使用Dropbox的作爲推動文件: 檢索帳戶信息這個簽名方法的工作原理:推文件通過Django的

parameters = { 
     'oauth_consumer_key' : DropboxConstants.app_key, 
     'oauth_token'   : dropbox.oauth_token, 
     'oauth_signature_method': oauth.SignatureMethod_HMAC_SHA1.name, 
     'oauth_timestamp'  : oauth.generate_timestamp(), 
     'oauth_nonce'   : oauth.generate_nonce(), 
     'oauth_version'   : DropboxConstants.api_version, 
     'oauth_signature'  : '' 
} 


access_token_g = oauth.Token(key=dropbox.oauth_token,secret=dropbox.oauth_token_secret) 
#prepare signature 
oauth_request  = oauth.Request(method="GET",url=DropboxConstants.account_info_url,parameters=parameters) 
signature_method_m = oauth.SignatureMethod_HMAC_SHA1() 

oauth_request.sign_request(signature_method=signature_method_m, 
          consumer=DropboxConstants.consumer, 
          token=access_token_g) 

resp, content = DropboxConstants.client.request(oauth_request.to_url()) 
if resp['status'] != '200': 
    print content 
    raise Exception("Invalid response from Dropbox.") 

account_info = simplejson.loads(content) 

但對於推Dropbox的文件我使用:

parameters = { 
     'oauth_consumer_key' : DropboxConstants.app_key, 
     'oauth_token'   : dropbox.oauth_token, 
     'oauth_signature_method': oauth.SignatureMethod_HMAC_SHA1.name, 
     'oauth_timestamp'  : oauth.generate_timestamp(), 
     'oauth_nonce'   : oauth.generate_nonce(), 
     'oauth_version'   : DropboxConstants.api_version, 
     'oauth_signature'  : '', 
     'file'     : request.FILES['file'].name, 
    } 

    access_token_g = oauth.Token(key=dropbox.oauth_token,secret=dropbox.oauth_token_secret) 

    #prepare signature 
    oauth_request  = oauth.Request(method="POST", 
             url=DropboxConstants.file_access_url, 
             parameters=parameters) 

    signature_method_m = oauth.SignatureMethod_HMAC_SHA1() 

    oauth_request.sign_request(signature_method=signature_method_m, 
           consumer=DropboxConstants.consumer, 
           token=access_token_g) 

    resp, content = DropboxConstants.client.request(oauth_request.to_url()) 
    if resp['status'] != '200': 
     print content 
     raise Exception("Invalid response from Dropbox.") 

它給了我這個錯誤

{"error": "Invalid signature. Expected signature base string: GET&https%3A%2F%2Fapi-content.dropbox.com%2F0%2Ffiles%2Fdropbox%2F&oauth_body_hash%3D2jmj7l5rSw0yVb%252FvlWAYkK%252FYBwk%253D%26oauth_consumer_key%3Dedw6k7d78hu8q8v%26oauth_nonce%3D69188147%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1314863397%26oauth_token%3Dv0b6uxv18z2wrmg%26oauth_version%3D1.0"} 

signature that is generated is: 
AUHJv%2F%2BCeRP27PsJ1X5eMaSghGU%3D 

我遇到過一篇文章:https://github.com/ourbricks/ourbricks-api-examples/blob/master/python/upload2ourbricks.py#L126-173但沒有得到什麼已經完成。

回答

0

對不起,問,你爲什麼不乾脆在服務器上安裝Dropbox的客戶端和文件推送到其同步文件夾?

+0

我去我的應用程序與不同的Oauth提供商聯繫起來......於是就想抽象通用代碼到一個單一的Django應用程序......這就是爲什麼我使用的oauth2應用Django的,而不是使用個人客戶將成爲有點兒在維修中感到困惑。我是否有道理,或者你覺得我應該以其他方式? – amd