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_secret 和 grant_type 在 base_string.
解决方法:
我必须创建自己的 类:copy/paste 代码从 OAuthHelper 到 MyOAuthHelper 和 TwoLeggedOAuthHelper 到 MyTwoLeggedOAuthHelper。您需要来自 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
我一直坚持将 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_secret 和 grant_type 在 base_string.
解决方法:
我必须创建自己的 类:copy/paste 代码从 OAuthHelper 到 MyOAuthHelper 和 TwoLeggedOAuthHelper 到 MyTwoLeggedOAuthHelper。您需要来自 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