github выдает api 401, почему? (Джанго)

Я пытаюсь интегрировать API проблем github в проект. Я думаю, что соблюдаю правила oauth и все, что необходимо и упоминается на http://develop.github.com/p/issues.html, но похоже, что это не работает. Я не получаю подробного сообщения об ошибке, только 401.

  • Я зарегистрировал приложение oauth в github (api v2) и предоставил URL-адрес обратного вызова.
  • я создаю URL-адрес аутентификации: https://github.com/login/oauth/authorize?client_id=...&redirect_uri=http://.../no_port/
  • Они отправляют мне код (токен запроса), я обмениваю его токеном доступа, он работает нормально. Проблемы:
  • Я могу следить за своими проблемами в своих репозиториях, но если я просто соавтор, это 401 (неавторизованный)
  • Невозможно создать новую проблему, даже в моем собственном репо: POST: http://github.com/api/v2/json/issues/open/:user/:repo ПАРАМЕТРЫ: body = & login = & token = 6 & title =

фактические реализации с django, python:

url = 'https://github.com/login/oauth/access_token?client_id=%(client_id)s&redirect_uri=%(redirect_uri)s&client_secret=%(client_secret)s&code=%(code)s' % locals()        
req = urllib2.Request(url)
response = urllib2.urlopen(req).read()
access_token = re.search(r'access_token=(\w+)', response).group(1)
url = 'http://github.com/api/v2/json/issues/open/%(user)s/%(repo)s' % locals()
params = urllib.urlencode({'login': user, 'token': access_token, 'title': 'title', 'body': 'body'})
req = urllib2.Request(url, params)
try:
    response = urllib2.urlopen(req)
except HTTPError, e:
    return HttpResponse('[*] Its a fckin %d' % e.code)
except URLError, e:
    return HttpResponse('[*] %s\n' % repr(e.reason))
else:
    resp = json.loads(response.read())

person kecske    schedule 14.07.2011    source источник
comment
На самом деле у меня похожая проблема. Я использую Ruby, а не Python, но проблема в том, что я получаю сообщение об ошибке 401, если пытаюсь получить доступ к проблемам частного репо, принадлежащего организации, к которой я принадлежу. У меня есть полные разрешения на это репо.   -  person adamjford    schedule 14.07.2011
comment
Я сталкиваюсь с той же проблемой, используя v3 api и базовую аутентификацию.   -  person rubergly    schedule 11.08.2011
comment
Похоже, проблема с API, было бы правильно опубликовать это как ошибку для разработчиков github, просто чтобы убедиться   -  person Mario César    schedule 12.08.2011
comment
Стажер моей компании столкнулся с некоторыми проблемами с API, и github здорово помог ему с API, а также решил проблему с самим API.   -  person TomHarrigan    schedule 12.09.2011
comment
Глядя на этот код, я не уверен, что вы правильно создаете OAuthed POST. Вам нужно больше, чем просто токен - вы также должны подписывать хэш параметров? Почему бы не попробовать использовать библиотеку OAuth для выполнения запросов - гораздо более вероятно, что они будут успешными.   -  person Malcolm Box    schedule 12.01.2012


Ответы (2)


Может быть проблема ..

params = urllib.urlencode(
    {'login': user, 'token': access_token, 'title': 'title', 'body': 'body'}
)

Вы указываете, что параметр title имеет буквальное значение title, то же самое с body.

Вы, возможно, хотите это вместо этого? ..

params = urllib.urlencode(
    {'login': user, 'token': access_token, 'title': title, 'body': body}
)
person synthesizerpatel    schedule 13.01.2012
comment
На самом деле, 'title' и 'body' - это некий фиктивный текст, чтобы продемонстрировать проблему :), но если теперь это работает для @Valentin Lorentz, они могли бы решить проблему api. - person kecske; 14.01.2012

Я не знаю, действительно ли это то, что вам нужно, но вот код, который я использую в одном из моих проектов, чтобы открывать проблемы:

def issue(self, channel, network, nick, user, title, repoName):
    body = 'Issue sent from %s at %s by %s (registered as %s)' % \
            (channel, network, nick, user.name)
    login = self.registryValue('login')
    token = self.registryValue('token')
    data='title=%s&body=%s&login=%s&token=%s' % (title, body, login, token)
    url = 'http://github.com/api/v2/json/issues/open/' + repoName
    response = json.loads(urllib.urlopen(url, data=data).read())
    id = response['issue']['number']
    return id
person Valentin Lorentz    schedule 29.11.2011