1

我正在与 Flask 一起开发面包店项目(想法类似于 Travis CI,但在 python 中完成)。并制作为拥有授权 github 用户的存储库添加 webhook 的模块。我没有在这里粘贴完整的示例代码,这是我正在尝试做的片段。完整示例可在单独的 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 调用:

$ 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 来简化代码并使其工作?

4

3 回答 3

4

我相信 Flask-Oauth 使用 python-oauth2,在这一点上它已经过时了。您可能会考虑使用不同的客户端库。我可以推荐rauth。特别是,请查看 Facebook Flask 示例。完全披露我是 rauth 的作者。

于 2013-04-13T15:26:59.283 回答
2

正如@maxcountryman 所说,Flask-OAuth 已经过时了。

Flask-OAuth 还有另一个替代品:Flask-OAuthlib

它有一个GitHub的例子:https ://github.com/lepture/flask-oauthlib/blob/master/example/github.py

于 2013-08-20T01:21:34.250 回答
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 示例还存在具有 rauth 支持的 Flask-OAuth 端口,称为Flask-Rauth自 rauth API 更新以来不起作用。

于 2013-04-14T04:37:54.757 回答