【问题标题】:Removing oauth_token from request header in Scribe从 Scribe 中的请求标头中删除 oauth_token
【发布时间】:2012-01-19 13:58:18
【问题描述】:

我们正在尝试连接另一家公司的自定义 API,该 API 使用两条腿 OAuth 来验证请求并向我们发送响应。

目前,我们拥有的代码正在发送请求,但在另一端未经过身份验证,因此发送了 UNAUTHORIZED 响应。

到目前为止我们调查的步骤:

  • 使用 Python 中的 OAuth 实现并使用 相同的凭据连接到远程站点。
  • 要求另一家公司将我们的 OAuth 请求与另一家成功的 OAuth 请求进行比较,看看我们的 OAuth 请求中是否缺少任何内容。

在上面的第二点之后,我们的请求和另一个工作请求之间的唯一区别是oauth_token 参数存在于我们的请求中而不是其他请求中。此外,他说他们在大多数的请求中都有oauth_body_hash_value,但我们的请求中没有 - 尽管没有它他们确实会收到有效的请求。

有没有办法删除 Scribe 中的 oauth_token 参数?或者,是否总是需要oauth_body_hash_value?没有请求可以工作吗?

我已经包含了下面的代码,我对 OAuth 完全陌生,所以请随时告诉我是否还有其他问题。

请注意,TestAPI.class 扩展了 DefaultAPI10a,并且只为所有三个必需的方法返回 ""。

public class TestImporter {

  private static final String REQ_URL   = "http://test.com/";

  private static final String KEY         = "KEY";
  private static final String SECRET      = "SECRET";

  // test variables
  private static final String VAR1        = "Test123";

  public static void main(String[] args) {

    OAuthService service = new ServiceBuilder()
                               .provider(TestAPI.class)
                               .apiKey(KEY)
                               .apiSecret(SECRET)
                               .build();
    Token token = new Token("", "");
    OAuthRequest request = new OAuthRequest(Verb.GET, REQ_URL + VAR1 + "/");
    service.signRequest(token, request);
    Response response = request.send();
    System.out.println(response.getBody());

  }

}

【问题讨论】:

    标签: java oauth scribe two-legged


    【解决方案1】:

    关于your own answer 似乎您想要做的是将签名放在查询字符串中,而不是使用 Authorization 标头。

    虽然有效,但不建议这样做。无论如何,如果你真的需要这样做,有一种方法可以创建 OAuthService 以在查询字符串中“签名”:

    ServiceBuilder()
      .provider(TestAPI.class)
      .apiKey(KEY)
      .apiSecret(SECRET)
      .signatureType(SignatureType.QueryString)
      .build();
    

    【讨论】:

      【解决方案2】:

      事实证明,当我们认为我们正在发送一个完整的 HTTP GET 请求时,我们并没有。

      库将所有信息添加到标头(我们从中获取信息的位置),但没有将任何 oauth 信息添加到请求 URL。我只能假设这与我们使用两条腿授权(因此是空的 Token)有关。

      通过将oAuthParameters 的映射复制到queryStringParameters,这样就可以正确形成Url。

      【讨论】:

      • .signatureType(SignatureType.QueryString) 添加到您的 ServiceBuilder 可以解决您的问题,正如 Pablo 所提到的。
      【解决方案3】:

      假设它们的实现没有被破坏,那么包含“额外”的 OAuth 标头应该没有关系。话虽如此,oauth_token 标头是 not 可选的(我假设您正在使用 OAuth 1.0 进行通信)。此标头应包含用户的访问令牌。在您的示例中,您将此标记显示为空白,这很奇怪!

      现在假设出于某种原因向该第三方系统发送空白“用户名”是有效的,您需要确保您的 OAuth 签名在双方(您的公司和其他公司)都匹配。使用协议嗅探器捕获oauth_signature 标头的值,然后要求您的第三方验证他们生成的签名是否相同。如果不是,那么您可能有签名哈希问题。

      【讨论】:

      • 感谢您的帮助。事实证明,当我们认为我们正在发送一个完整的 HTTP GET 请求时,我们并没有。该库将所有信息添加到标头(我们从中获取信息的位置),但没有将任何 oauth 信息添加到请求 URL。我只能假设这与我们使用两条腿授权(因此是空令牌)有关。通过将oAuthParameters 的映射复制到queryStringParameters 中,这样就可以正确形成Url。
      • 有趣。特别是因为 oauth 信息应该在标头中,而不是在查询字符串中。需要注意的一件事是在计算 oauth 签名时是否包含其他标头。这有时是签名库的问题。
      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2020-04-19
      相关资源
      最近更新 更多