3

我有一个 Android 客户端,需要使用 OAuth 对 python Google App Engine 应用程序进行身份验证。我跟着这篇文章

并且能够使用 HTTP 获取请求成功地做到这一点。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 (google.appengine.api.oauth) 上使用 oauth python 包,我的服务器能够验证用户并确定用户的电子邮件地址 (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();

但是现在,在 GAE python 服务器端,我无法确定当前用户。HTTP 标头包含相同的 OAuth 身份验证标头(具有不同的随机数、时间戳和签名,但相同的 oauth 令牌)。“param1”和“param2”在 HTTP Payload 中。也许我的 POST 请求构造不正确?

我使用Ikai Lan(Google App Engine 支持团队)的 Python 客户端代码对我的 GAE 服务器进行身份验证。这也有效……带有 GET 请求的原始客户端,甚至当我修改它以使用 POST 请求时也是如此。我注意到,尽管使用 POST 请求,oauth 参数作为 URL 编码值包含在 HTTP 有效负载中,而不是 HTTP 标头中。这是 Oauth 签名的 HTTP 发布请求的要求吗?

提前致谢!

4

1 回答 1

1

不幸的是,尚未实现基于表单编码 HTTP 内容参数的正确 OAuth 1.0a 编码。我们收到了很多这方面的要求。已经为它打开了一个功能请求

于 2012-01-17T13:48:48.607 回答