oauth на appengine: проблема с доступом - PullRequest
0 голосов
/ 27 августа 2010

У меня возникли трудности с доступом к ресурсам через OAuth в AppEngine.

Мое клиентское приложение (в Linux с использованием python-oauth) может получить действительный «токен доступа», но когда я пытаюсь получить доступ к защищенному ресурсу (например, user = oauth.get_current_user()), я получаю исключение oauth.OAuthRequestError. 1005 *

headers: {'Content-Length': '21', 'User-Agent': 'musync,gzip(gfe),gzip(gfe)', 'Host': 'services.systemical.com', 'X-Google-Apps-Metadata': 'domain=systemical.com', 'X-Zoo': 'app-id=services-systemical,domain=systemical.com', 'Content-Type': 'application/json', 'Authorization': 'OAuth oauth_nonce="03259912", oauth_timestamp="1282928181", oauth_consumer_key="services.systemical.com", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_token="1%2Fo0-tcGTfRzkkm449qVxd_8CfCvMcW_0xwL024nO3HgI", oauth_signature="2ojSK6Ws%2BvDxx3Rdlltf53hlI2w%3D"'}

Я подозреваю, что проблема может быть связана с доменом, т.е. я использую конечную точку на services.systemical.com, в то время как я вижу, что AppEngine сообщает domain=systemical.com для X-Google-Apps-Metadata.

Как мне это исправить? Это проблема с тем, как я использую субдомены с Apps / AppEngine ??


Домен "services.systemical.com" указывает на (DNS CNAME) мое приложение appengine services-systemical.appspot.com. Домен systemical.com связан с доменом Служб Google.


Обновление: Вот код клиента, который я использую:

class OauthClient(object):

    gREQUEST_TOKEN_URL = 'OAuthGetRequestToken'
    gACCESS_TOKEN_URL =  'OAuthGetAccessToken'
    gAUTHORIZATION_URL = 'OAuthAuthorizeToken'

    def __init__(self, server, port, base):
        self.server=server
        self.port=port
        self.base=base
        self.request_token_url=self.base+self.gREQUEST_TOKEN_URL
        self.access_token_url=self.base+self.gACCESS_TOKEN_URL
        self.authorize_token_url=self.base+self.gAUTHORIZATION_URL
        self.connection = httplib.HTTPConnection("%s:%d" % (self.server, self.port))

    def fetch_request_token(self, oauth_request):
        self.connection.request(oauth_request.http_method, self.request_token_url, headers=oauth_request.to_header()) 
        response = self.connection.getresponse()
        print response.status, response.reason
        print response.msg
        return oauth.OAuthToken.from_string(response.read())

    def fetch_access_token(self, oauth_request):
        self.connection.request(oauth_request.http_method, self.access_token_url, headers=oauth_request.to_header()) 
        response = self.connection.getresponse()
        return oauth.OAuthToken.from_string(response.read())

    def authorize_token(self, oauth_request):
        self.connection.request(oauth_request.http_method, oauth_request.to_url()) 
        response = self.connection.getresponse()
        return response.read()

1 Ответ

0 голосов
/ 01 сентября 2010

У меня была похожая проблема.Хотя я не могу быть более конкретным (у меня нет кода со мной), я могу сказать вам, что проблема, вероятно, связана с запросом.Google App Engine очень требователен к вашему запросу.

Попробуйте отправить тело запроса пустым.Например, это обычный вызов:

import httplib
connection = httplib.HTTPSConnection('server.com')
connection.request('POST', REQUEST_TOKEN_URL,body = urlencode(body), headers = {'Authorization': header})

, но вы должны отправить с пустым телом:

connection.request('POST', REQUEST_TOKEN_URL, headers = {'Authorization': header})

Заголовки содержат всю информацию, необходимую для OAuth.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...