2013-04-12 3 views
1

나는 bakery 프로젝트에서 Flask와 함께 작업하고 있습니다 (아이디어는 Travis CI와 비슷하지만 파이썬에서 완료되었습니다). 그리고 권한이 부여 된 github 사용자를 소유 한 저장소에 webhook을 추가하는 모듈 만들기. 여기서 전체 예제 코드를 붙여 넣지는 않겠습니다. 여기에 내가하려는 것을 보여줍니다. 전체 예제는 separate gist입니다.Flask OAuth Github POST 요청

문제는 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) 

나는 플라스크-의 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 및 종속 모듈과 유사한 문제가됩니다 다른 사람들을 위해 매우 helpfull 없습니다. 구식 OAuth2는 PATCH 메소드를 지원하지 않으며 다른 문제가있을 수 있습니다. Max Countryman의 조언을 따르고 rauth을 시도해보십시오. 모듈은 Flask example입니다. Flask-Rauth 라 불리는 불량 포트가있는 Flask-OAuth 포트도 있습니다. rauth API 업데이트 이후 작동하지 않습니다.

4

Flask-Oauth는 python-oauth2를 사용합니다.이 시점에서는 상당히 오래된 것입니다. 다른 클라이언트 라이브러리 사용을 고려할 수 있습니다. rauth을 권해드립니다. 특히 Facebook Flask 예제를 확인하십시오. 전체 공개 나는 rauth의 저자입니다.

+0

최대 : Flask-OAuthlib

그것은 GitHub의 예를 가지고 플라스크-OAuth를위한 또 다른 교체가

. 그러나 다른 문제를 발견하고 그것이 문제와 수정의 유한 체인이라는 것을 확신하지 못했습니다. 아마 당신의 lib로 전환하려고 노력할 것입니다. 예를 들어 HTTP PATCH 메소드를 지원합니다. 귀하의 링크, 예제 및이 답변을 주셔서 대단히 감사합니다. –

+1

@MikhailKashkin이 (가) 당신이 그것을 고칠 수있게되어 기쁩니다! 당신이 맹공격을 시도하기로 결정했다면, 궁금한 점이 있으면 저에게 핑계를 치십시오. – maxcountryman

2

플라스크 - OAuth는 @maxcountryman과 같이 구식입니다. 내가 OAuth2를에 요청 클래스의 방법을 to_header하는 원숭이 패치를 만든 후 실제로 파고, https://github.com/lepture/flask-oauthlib/blob/master/example/github.py

+0

나는 rauth를 사용하고 Wiki에 예제를 게시하여 GitHub https://github.com/litl/rauth/wiki/Use-cases와 함께 사용하는 방법을 고려했습니다. –