我在bakery项目上使用Flask(想法类似于Travis CI,但是在python中完成)。并制作模块,为拥有授权github用户的存储库添加webhooks。我不会在这里粘贴完整的示例代码,这里是我正在尝试做的代码片段。 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)
我检查了哪些标头生成了Flask-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"}}'
所以,问题是:是否可以让它看起来更好并使用Flask OAuth方法POST来简化代码并使其正常工作?
答案 0 :(得分:4)
我相信Flask-Oauth使用的是python-oauth2,在这一点上已经过时了。您可以考虑使用其他客户端库。我可以推荐rauth。特别是,请查看Facebook Flask示例。完全披露我是rauth的作者。
答案 1 :(得分:2)
Flask-OAuth已经过时,正如@maxcountryman所说。
Flask-OAuth还有另一个替代品:Flask-OAuthlib
它有一个GitHub示例:https://github.com/lepture/flask-oauthlib/blob/master/example/github.py
答案 2 :(得分: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
这是临时解决方案,对于与Flask-OAuth和依赖模块有类似问题的其他人可能不太有帮助。 OAuth2看起来过时不支持PATCH方法,可能还有其他问题,可能您可以按照Max Countryman的建议尝试rauth
。模块有Flask example。 还存在Flask-OAuth的端口,其rauth支持名为Flask-Rauth 自rauth API更新后无效。