Google oauth1 迁移到 oauth2:无效授权 header

Google oauth1 migration to oauth2: Invalid authorization header

我一直坚持将 oauth1 迁移到 oauth2。我不想让我的用户再次授予联系人访问权限,所以我更愿意自己进行迁移,但我很难弄清楚为什么它不起作用。

我从 Google 服务器收到此错误:

DEBUG -  << "  "error" : "invalid_request",[\n]"
DEBUG -  << "  "error_description" : "Invalid authorization header."[\n]"

这是我的代码,我在使用 google api 时做了几乎相同的事情,但对于迁移它不起作用。

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(getConsumerKey());
oauthParameters.setOAuthConsumerSecret(getConsumerSecret());
oauthParameters.setOAuthToken(token);

ClassPathResource cpr = new ClassPathResource("mykey.pk8");
File file = cpr.getFile();
PrivateKey privKey = getPrivateKey(file);

OAuthRsaSha1Signer signer = new OAuthRsaSha1Signer(privKey);
GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer);

String requestUrl = "https://www.googleapis.com/oauth2/v3/token";

String header = oauthHelper.getAuthorizationHeader(requestUrl, "POST", oauthParameters);

String payload = "grant_type=urn:ietf:params:oauth:grant-type:migration:oauth1&client_id="+com.app.framework.utils.OAuthHelper.OAUTH2_CLIENT_ID+"&client_secret="+com.app.framework.utils.OAuthHelper.OAUTH2_CLIENT_SECRET;

HttpClient httpClient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost(requestUrl);
httpPost.addHeader("Authorization", header);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
httpPost.setEntity(new ByteArrayEntity(payload.getBytes()));
String response = httpClient.execute(httpPost, new BasicResponseHandler());

您的请求未通过签名验证。请查看对 this related question 的回复,了解有关如何为您的请求构造基本字符串并对其签名的详细说明。

希望对您有所帮助!

在与@Miguel 交换了一些电子邮件后,他成功地向我指出了解决方案。

问题:

GoogleOAuthHelper扩展的OAuthHelper使用TwoLeggedOAuthHelper构建base_string。 TwoLeggedOAuthHelper 没有注入 3 个必需的参数:client_id、client_secretgrant_type 在 base_string.

解决方法:

我必须创建自己的 类:copy/paste 代码从 OAuthHelperMyOAuthHelperTwoLeggedOAuthHelperMyTwoLeggedOAuthHelper。您需要来自 GoogleOAuthHelper 的一些声明来解决编译错误。

MyOAuthHelper 将调用 MyTwoLeggedOAuthHelper 而不是 TwoLeggedOAuthHelper.

现在在 MyTwoLeggedOAuthHelper 中,在 行 79 附近,找到

String baseString = OAuthUtil.getSignatureBaseString(baseUrl, httpMethod,…

并添加以下内容:

String clientId = "client_id%3DXXX123456789XXX.apps.googleusercontent.com%26";
String clientSecret = "client_secret%3DXXXX_XXXX_XX_XX%26";
String grantType = "grant_type%3Durn%253Aietf%253Aparams%253Aoauth%253Agrant-type%253Amigration%253Aoauth1%26";

baseString = StringUtils.replace(baseString, "token&", "token&" + clientId + clientSecret + grantType);

一些注意事项:

  • client_id 和 client_secret 必须是您的后端用来获取 OAUTH1 访问令牌的那个。小心这一点,尤其是当您在 Google 控制台中定义了多个 "Client ID for web application" 时。

  • 注意疯狂的 grant_type 编码了两次。

  • 所用的Google类位于maven中:com/google/gdata/core/1.47.1/core-1.47.1.jar

感谢@Miguel