【问题标题】:Issue with Requesting OAuth Access Token请求 OAuth 访问令牌的问题
【发布时间】:2012-03-27 07:15:54
【问题描述】:

我正在为客户构建一个库以与 LinkedIn 的 API 集成,目前正在研究 OAuth 实施。我可以请求初始令牌没有问题,并让用户向我的应用程序授予身份验证,但是当我尝试使用 oauth_token 和 oauth_verifier 请求访问令牌时(以及我发送的其余 oauth 信息) ,我得到一个签名无效的错误。

我发送的 OAuth 设置如下:

  • oauth_consumer_key
  • oauth_nonce
  • oauth_timestamp
  • oauth_signature_method
  • oauth_version
  • oauth_token
  • oauth_verifier

我还添加了 oauth_signature,它是所有这些密钥的签名版本。我使用以下方法签署请求:

public void function signRequest(any req){
  var params = Arguments.req.getAllParameters();
  var secret = "#Variables.encoder.parameterEncodedFormat(getConsumer().getConsumerSecret())#&#Variables.encoder.parameterEncodedFormat(Arguments.req.getOAuthSecret())#";
  var base = '';

  params = Variables.encoder.encodedParameter(params, true, true);

  secret = toBinary(toBase64(secret));

  local.mac = createObject('java', 'javax.crypto.Mac').getInstance('HmacSHA1');
  local.key = createObject('java', 'javax.crypto.spec.SecretKeySpec').init(secret, local.mac.getAlgorithm());

  base = "#Arguments.req.getMethod()#&";
  base = base & Variables.encoder.parameterEncodedFormat(Arguments.req.getRequestUrl());
  base = "#base#&#Variables.encoder.parameterEncodedFormat(params)#";

  local.mac.init(local.key);
  local.mac.update(JavaCast('string', base).getBytes());

  Arguments.req.addParameter('oauth_signature', toString(toBase64(mac.doFinal())), true);
}

我知道它可以工作,因为我可以使用相同的方法来请求初始令牌(没有 oauth_token 或 oauth_verifier 参数),所以我假设这是我正在签名的参数的问题。 (是的,我在签名之前按字母顺序排列参数)

那么有没有我不应该包含在签名中的参数或另一个我应该包含的参数?

这是一个加密的基本字符串示例:

POST&https%3A%2F%2Fwww.linkedin.com%2Fuas%2Foauth%2FaccessToken&oauth_consumer_key%3Dwfs3ema3hi9s%26oauth_nonce%3D1887241367210%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1331326503%26oauth_token%3D8b83142a-d5a6-452e-80ef-6e75b1b0ce18%26oauth_verifier%3D94828%26oauth_version%3D1.0

【问题讨论】:

    标签: coldfusion oauth linkedin coldfusion-9 access-token


    【解决方案1】:

    好的,所以这是一个愚蠢的答案,但问题是当用户允许访问我的应用程序时我没有看到 oauth_token_secret 进入,所以我仍然尝试仅使用消费者密码和不是消费者机密和 oauth 令牌机密。

    【讨论】:

      【解决方案2】:

      发送POST请求时,需要将认证信息放在header中,而不是放在查询参数中。

      有关信息,请参阅此页面(查找“发送授权标头”): https://developer.linkedin.com/documents/common-issues-oauth-authentication

      我怀疑这是您遇到的问题。

      【讨论】:

      • 问题实际上是我没有同时使用消费者密码和 oauth 令牌密码进行签名。在向 API 发出请求之前,您不需要使用标头。在您完成 OAuth 身份验证之前,参数可以进入请求参数。
      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2011-06-22
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多