【问题标题】:Google oauth1 migration to oauth2: Invalid authorization headerGoogle oauth1 迁移到 oauth2:授权标头无效
【发布时间】:2015-06-23 22:17:51
【问题描述】:

我被 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());

【问题讨论】:

    标签: oauth migration gdata google-oauth


    【解决方案1】:

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

    问题:

    GoogleOAuthHelper 扩展的 OAuthHelper 使用 TwoLeggedOAuthHelper 来构建 base_string。 TwoLeggedOAuthHelper 没有注入 3 个必需参数:client_id、client_secret 和 base_string 中的 grant_type

    解决办法:

    我必须创建自己的类:将代码从 OAuthHelper 复制/粘贴到 MyOAuthHelper 以及从 TwoLeggedOAuthHelper 复制/粘贴到 MyTwoLeggedOAuthHelper时间>。您需要来自 GoogleOAuthHelper 的一些声明来解决编译错误。

    MyOAuthHelper 将调用 MyTwoLeggedOAuthHelper 而不是 TwoLeggedOAuthHelper

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

    字符串 baseString = OAuthUtil.getSignatureBaseString(baseUrl, http方法,…

    并添加以下内容:

    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 致敬

    【讨论】:

      【解决方案2】:

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

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多