我坚持将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());
答案 0 :(得分:1)
在与@Miguel交换了一些电子邮件之后,他成功地指出了解决方案。
问题:
GoogleOAuthHelper 扩展的 OAuthHelper 使用 TwoLeggedOAuthHelper 来构建base_string。 TwoLeggedOAuthHelper 没有在base_string中注入3个必需参数: client_id,client_secret 和 grant_type 。
解决方案:
我必须创建自己的类:将代码从 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控制台中定义了多个“Web应用程序的客户端ID”。
请注意疯狂的grant_type编码两次。
使用的Google课程位于maven:com / google / gdata / core / 1.47.1 / core-1.47.1.jar
感谢@Miguel
答案 1 :(得分:0)
您的请求未通过签名验证。请查看对this related question的回复,详细说明如何为您的请求构建基本字符串并签名。
希望有所帮助!