OAuthを使用してPythonGoogleAppEngineアプリで認証する必要があるAndroidクライアントがあります。私はこの記事に従いました。
そして、HTTPGetRequestを使用してこれを正常に行うことができました。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サーバーで、PROTECTED_URL_GET_USER_EMAILに対して行われたGETリクエストを調べたところ、適切な認証HTTPヘッダーが含まれていました。
'Authorization': 'OAuth oauth_consumer_key="shiprack-test1.appspot.com", oauth_nonce="...", oauth_signature="...", oauth_signature_method="HMAC-SHA1", oauth_timestamp="...", oauth_token="..."'
GAEのoauthpythonパッケージ(google.appengine.api.oauth)を使用すると、サーバーはユーザーを認証し、ユーザーのメールアドレスを特定できます(oauth.get_current_user())。
ただし、問題は、PROTECTED_URL_GET_USER_EMAILをHTTPPostリクエストに変換するときです。これは私がそれを行う方法です:
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();
しかし、現在、GAE pythonサーバー側では、現在のユーザーを特定できません。HTTPヘッダーには、同じOAuth認証ヘッダーが含まれています(ナンス、タイムスタンプ、署名は異なりますが、oauthトークンは同じです)。「param1」と「param2」はHTTPペイロードにあります。おそらく私のPOSTリクエストは正しく構築されていませんか?
PythonクライアントにIkaiLan (Google App Engineサポートチーム)のコードを使用して、GAEサーバーに対して認証しました。そして、これも機能しました... GETリクエストを使用した元のクライアント、およびPOSTリクエストを使用するように変更した場合でも。POSTリクエストでは、oauthパラメーターがHTTPヘッダーではなくHTTPペイロードにURLエンコードされた値として含まれていることに気付きました。これは、Oauthで署名されたHTTP POSTリクエストの要件ですか?
前もって感謝します!