2013-04-12 120 views
1

我正在與Flask合作bakery項目(想法類似於Travis CI,但在Python中完成)。以及爲擁有授權的github用戶的存儲庫添加webhooks的模塊。我不在這裏粘貼完整的示例代碼,這裏是我正在嘗試做的事情的片段。完整的示例可在separate gistFlask OAuth Github POST請求

問題是Github API GET請求沒有任何問題。但POST POST同時返回狀態401{"message":"Bad credentials"}作爲響應主體。

# this method is working 
@app.route('/repos') 
def repos(): 
    # only logged in user should call it, but I skip it in this example 
    resp = github.get('/user/repos', data = {'type': 'public'}) 
    # responce status code is ok, and data is returned 
    print(resp.data) # should print to console 

@app.route('/addhook/<path:full_name>') 
def repos(full_name): 
    HOOK_URL = 'http://example.com/hook' 
    resp = github.post('/repos/%(full_name)s/hooks' % {'full_name': full_name}, 
     data = { 
      'name':'web', 
      'active': True, 
      'events': ['push'], 
      'config': { 
       'url': HOOK_URL, 
       'content_type': 'json' 
      } 
     }, 
     format = 'json' 
    ) 
    # POST request is not working and form request that Github is not understand 
    print(resp.status, resp.data) 

我查了一下頭產生瓶,OAuth的,發現它增加附加的頭符合這一內容(跳過實際值):

authorization: 'OAuth realm="https://api.github.com", oauth_body_hash="...", oauth_nonce="...", oauth_timestamp="...", oauth_consumer_key="...", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_token="XXX", oauth_signature="..." 

而作爲結果Github上返回此狀態,並可能穿上」不知道該怎麼做。我找到了解決方法,如果我只複製令牌並直接調用Github API,那麼我可以得到預期的結果。這相當於捲曲電話:

$ curl https://api.github.com/repos/xen/league-gothic/hooks?access_token=XXX -X POST --data '{"name":"web","active":true,"events": ["push"],"config": {"url": "http://example.com/hook","content_type": "json"}}' 

所以,問題是:是否有可能使它看起來更好,使用OAuth的瓶POST方法來簡化代碼,使工作?

回答

1

關於我在我的問題中描述的問題。下面是解決它的猴子補丁:

# monkey patch OAuth 
import oauth2 
old_request = oauth2.Request 
del oauth2.Request 
class NewRequest(old_request): 
    def to_header(self, realm=''): 
     """According Github documentation this is enough for authentication 
     http://developer.github.com/v3/#authentication.""" 
     return {'Authorization': 'token %s' % self['oauth_token']} 

oauth2.Request = NewRequest 
# end monkey patch 

這是臨時的解決方案,可能不適合其他人誰將會有燒瓶的OAuth和依賴模塊類似的問題非常有幫助。 OAuth2看起來過時並不支持PATCH方法,可能還有其他問題,可能您可以按照Max Countryman的建議嘗試rauth。模塊有Flask example同時存在Flask-OAuth端口,支持被稱爲Flask-Rauth的rauth支持,因爲rauth API更新不起作用。

4

我相信Flask-Oauth使用python-oauth2,在這一點上它非常過時。您可以考慮使用不同的客戶端庫。我可以推薦rauth。特別是,請查看Facebook Flask示例。充分披露我是rauth的作者。

+0

最大,其實挖後,我做了一個猴子補丁to_header在請求類方法的OAuth2。但之後我發現了其他問題,並不確定它是否是有限的問題和修復鏈。可能我會嘗試切換到你的lib。例如它有HTTP PATCH方法支持。非常感謝您的鏈接,例子和答案。 –

+1

@MikhailKashkin很高興聽到你能夠修復它!如果您決定試用rauth,請隨時通過任何問題向我發送問題。 – maxcountryman