我正在与 Flask 合作 bakery项目(想法类似于 Travis CI,但在 python 中完成)。并制作为拥有授权 github 用户的存储库添加 webhook 的模块。我不会在这里粘贴完整的示例代码,这里是我正在尝试做的事情的片段。完整示例可在 separate gist 中找到.
问题是 Github API GET 请求没有任何问题。但同时 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)
我检查了哪些 header 生成 Flask-OAuth 并发现它添加了带有此内容的附加 header 行(跳过实际值):
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 返回了这个状态并且可能不明白如何处理这个。我找到了解决方法,如果我只复制 token 并直接调用 Github API,那么我可以获得预期的结果。这是等效的 curl 调用:
$ 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"}}'
所以,问题是:是否有可能让它看起来更好并使用 Flask OAuth 方法 POST 来简化代码并使其工作?
请您参考如下方法:
我相信 Flask-Oauth 使用的是 python-oauth2,它在这一点上已经过时了。您可能会考虑使用不同的客户端库。我可以推荐rauth .特别是查看 Facebook Flask 示例。完全披露我是 rauth 的作者。
