有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从Scribe中的请求头中删除oauth_令牌

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

目前,我们的代码正在发送一个请求,但另一端没有进行身份验证,因此发送了一个未经授权的响应

到目前为止,我们已经调查了以下步骤:

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

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

有没有办法删除Scribe中的oauth_token参数?或者,是否总是需要oauth_body_hash_value?一个请求可以不使用吗

我已经包含了下面的代码,我对OAuth是全新的,所以如果有其他错误,请随时告诉我

请注意,TestAPI。类扩展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());

  }

}

共 (3) 个答案

  1. # 1 楼答案

    假设它们的实现没有被破坏,那么包含“额外的”OAuth头就不重要了。话虽如此,oauth_token头是而不是可选的(我假设您正在使用OAuth1.0进行通信)。此标头应包含用户的访问令牌。在您的示例中,您将此令牌显示为空白,这很奇怪

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

  2. # 2 楼答案

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

    该库将所有信息添加到标题中(我们从中获取信息),但没有将任何oauth信息添加到请求Url中。我只能假设这与我们使用双腿授权有关(因此是空令牌)

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

  3. # 3 楼答案

    关于your own answer,您要做的似乎是将签名放在querystring中,而不是使用Authorization

    这虽然有效,但不建议使用。无论如何,如果您确实需要这样做,有一种方法可以在querystring中创建OAuthService“签名”:

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