При использовании Google API Java Client на Android POST-запрос не проходит проверку подлинности в приложении Google App Engine с использованием OAuth - PullRequest
3 голосов
/ 15 января 2012

У меня есть клиент Android, который должен пройти аутентификацию в приложении Python для Google App Engine с использованием OAuth. Я следовал этой статье .

И смог успешно сделать это, используя HTTP Get Request. Для этого клиент Android использует пакет com.google.api.client:

OAuthHmacSigner _signer;
HttpTransport TRANSPORT = new NetHttpTransport();
_signer = new OAuthHmacSigner();
_signer.clientSharedSecret = CONSUMER_SECRET;

// STEP1: get a request token
OAuthGetTemporaryToken requestToken = new OAuthGetTemporaryToken(REQUEST_TOKEN_URL);
requestToken.consumerKey = CONSUMER_KEY;
requestToken.transport = TRANSPORT;
requestToken.signer = _signer;
requestToken.callback = "http://my_app_specific_callback";
requestTokenResponse = requestToken.execute();
OAuthAuthorizeTemporaryTokenUrl authorizeUrl = new OAuthAuthorizeTemporaryTokenUrl(AUTHORIZE_URL);
authorizeUrl.temporaryToken = requestTokenResponse.token;
// at this point, redirect the user using a WebView to the URL string returned by authorizeUrl.build().  Continue below once the user has granted request.

// STEP2: get an access token
_signer.tokenSharedSecret = requestTokenResponse.tokenSecret;
OAuthGetAccessToken accessToken = new OAuthGetAccessToken(ACCESS_TOKEN_URL);
accessToken.consumerKey = CONSUMER_KEY;
accessToken.signer = _signer;
accessToken.transport = TRANSPORT;
accessToken.temporaryToken = requestTokenResponse.token;
accessTokenResponse = accessToken.execute();

// STEP3: use the access token acquired above to access a protected resource
_signer.tokenSharedSecret = accessTokenResponse.tokenSecret;
OAuthParameters parameters = new OAuthParameters();
parameters.consumerKey = CONSUMER_KEY;
parameters.token = accessTokenResponse.token;
parameters.signer = _signer;
HttpRequestFactory factory = TRANSPORT.createRequestFactory(parameters);
HttpRequest req = factory.buildGetRequest(new GenericUrl(PROTECTED_URL_GET_USER_EMAIL));
com.google.api.client.http.HttpResponse resp = req.execute();

В приведенном фрагменте кода все 3 шага работают нормально. И на своем сервере Google App Engine я проверил запрос GET к PROTECTED_URL_GET_USER_EMAIL, и он содержал правильный заголовок HTTP аутентификации:

'Authorization': 'OAuth oauth_consumer_key="shiprack-test1.appspot.com", oauth_nonce="...", oauth_signature="...", oauth_signature_method="HMAC-SHA1", oauth_timestamp="...", oauth_token="..."'

Используя пакет oauth python в GAE (google.appengine.api.oauth), мой сервер может аутентифицировать пользователя и определить адрес электронной почты пользователя (oauth.get_current_user ()).

Однако проблема заключается в том, что я преобразовываю PROTECTED_URL_GET_USER_EMAIL в запрос HTTP Post. Вот как я это делаю:

Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("param1", "value1")
paramsMap.put("param2", "value2")
HttpRequest req = _httpRequestFactory.buildPostRequest(new GenericUrl(url), new UrlEncodedContent(paramsMap));
req.setFollowRedirects(true);
com.google.api.client.http.HttpResponse resp = req.execute();

Но сейчас, на стороне Python-сервера GAE, я не могу определить текущего пользователя. Заголовки HTTP содержат одинаковые заголовки проверки подлинности OAuth (с другим nonce, отметкой времени и подписью, но с одним и тем же маркером oauth). «Param1» и «param2» находятся в полезной нагрузке HTTP. Возможно, мой POST-запрос не создан должным образом?

Я использовал Ikai Lan (команда службы поддержки Google App Engine) для клиента Python для аутентификации на моем сервере GAE. И это тоже сработало ... оригинальный клиент с запросом GET, и даже когда я изменил его для использования запроса POST. Я заметил, однако, что с запросом POST параметры oauth были включены как значения в кодировке URL в полезную нагрузку HTTP вместо заголовка HTTP. Это требование для подписанных Oauth HTTP-запросов?

Заранее спасибо!

1 Ответ

1 голос
/ 17 января 2012

К сожалению, правильная кодировка OAuth 1.0a на основе закодированных в форме параметров содержимого HTTP еще не реализована. Мы получили довольно много запросов на это. Для него уже открыт запрос .

...