Ошибка аутентификации OAuth на PUT - PullRequest
0 голосов
/ 02 августа 2011

Я использую OAuth в моем проекте. но я столкнулся с проблемой аутентификации.

Дело в том, что я могу передать аутентификационный механизм Oauth методом «POST», но не методом «PUT». Единственная разница между запросами POST и PUT заключается в типе метода. Тело и заголовок одинаковые. Я использовал следующие запросы:

POST

resp, cont = client.request("http://localhost:8000/api/1.0/booking/",
                            "POST", 
                            data_booking,
                            headers=headers) 

PUT

resp, cont = client.request("http://localhost:8000/api/1.0/booking/",
                            "PUT",
                            data_booking,
                            headers=headers)

Клиент является клиентом OAuth.

Сообщение об ошибке, возвращаемое сервером:

enter image description here

Fyi: 401 Несанкционированный

Аналогично 403 Запрещено, но специально для использования, когда аутентификация возможна, но не прошла или еще не была предоставлена ​​

Я занимаюсь разработкой с использованием фреймворка django.

Метод запроса следующий:

def request(self, uri, method="GET", body=None, headers=None, 
        redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None,
        callback_url=None, realm=''):
        DEFAULT_CONTENT_TYPE = 'application/x-www-form-urlencoded'

        if not isinstance(headers, dict):
            headers = {}

        is_multipart = method == 'POST' and headers.get('Content-Type', 
            DEFAULT_CONTENT_TYPE) != DEFAULT_CONTENT_TYPE

        if body and (method == "POST" or method == 'PUT') and not is_multipart:
            parameters = dict(parse_qsl(body))
            if callback_url != None:
                parameters['oauth_callback'] = callback_url
        else:
            if callback_url != None and not is_multipart:
                parameters = {'oauth_callback': callback_url}
            else:
                parameters = None

        req = Request.from_consumer_and_token(self.consumer, 
            token=self.token, http_method=method, http_url=uri, 
            parameters=parameters)

        req.sign_request(self.method, self.consumer, self.token)

        if method == "POST" or method == "PUT":
            headers['Content-Type'] = headers.get('Content-Type', 
                DEFAULT_CONTENT_TYPE)
            if is_multipart:
                headers.update(req.to_header(realm))
            else:
                body = req.to_postdata()
        elif method == "GET":
            uri = req.to_url()
        else:
            headers.update(req.to_header(realm))

        return httplib2.Http.request(self, uri, method=method, body=body, 
            headers=headers, redirections=redirections, 
            connection_type=connection_type)

У кого-нибудь есть идея?

1 Ответ

1 голос
/ 02 августа 2011

В некоторых реализациях сервера OAuth параметры тела в кодированной форме включаются только в базовую строку сигнатуры, когда для HTTP-метода задан метод POST. Это было правильное поведение в OAuth 1.0, но оно было исправлено в последующих версиях. Попробуйте сделать запрос PUT без тела и посмотрите, поможет ли это. Если это произойдет, вам нужно будет попросить сопровождающего серверной библиотеки исправить это или ограничить ваши вызовы, чтобы они не включали тело в кодированной форме при использовании пута.

...