验证OAuth签名或请求

时间:2015-02-02 12:57:08

标签: java servlets oauth

我必须验证来自OAuth签名的服务器的请求调用。此请求调用发送到我的服务器,我需要验证是否从该服务器发出请求。我有oauth消费者密钥和消费者秘密。我一直在寻找路标和球衣库API进行签名验证。他们没有太多帮助。 调用是从特定服务器(具有两条腿OAuth 1.0)到我的servlet。请建议一个更简单的库或示例来进行OAuth验证。

1 个答案:

答案 0 :(得分:0)

我在使用Scala中的Play框架编写Web服务时遇到了同样的问题,我必须使用Java库进行编码才能解决它,所以即使我的代码片段在Scala中,我认为它可以提供帮助。这个答案可能会有点晚,但希望有人可能觉得它很有用。

就我而言,外部服务正在调用我的REST端点,同时在Authorization标头内提供不同的oauth参数。为了验证作为这些参数的一部分提供的oauth_signature,我必须从头中提取nonce和timestamp参数,并根据它们加上基于一些其他参数计算签名,包括我的oauth密钥和秘密,以及原始请求uri。

此代码在scala中,但我认为您可以从中推断出该做什么。它也使用java OAuthSignatureCalculator,因此甚至可以更容易直接用Java编写代码。

private def getProtocolFromRequest[T](request: Request[T]): String = {
  // To handle the case where a SSL offloading is involved
  request.headers.get(HeaderNames.X_FORWARDED_PROTO) match {
    case Some(forwardedProto: String) => forwardedProto
    case _ => if(request.secure) "https" else "http"
  }
}

def isOAuthSignatureValid[T](request:  Request[T]): Boolean = {
  request.headers.get(com.ning.http.client.oauth.OAuthSignatureCalculator.HEADER_AUTHORIZATION) match {
    case Some(authorizationHeaders) =>
      val AuthRegex = ".*oauth_nonce=\"([^\"]*)\".*oauth_signature=\"([^\"]*)\".*oauth_timestamp=\"([^\"]*)\".*".r

      authorizationHeaders match {
        case AuthRegex(nonce: String, providedSignature: String, timestamp: String) =>
          val signatureCalculator = new OAuthSignatureCalculator(new com.ning.http.client.oauth.ConsumerKey(oauthKey, oauthSecret), new com.ning.http.client.oauth.RequestToken(null, ""))
          val params = request.queryString.map(query => new Param(query._1, query._2.head)).toSeq
          val protocol = getProtocolFromRequest(request)
          val url = s"$protocol://${request.host}${request.path}"

          val expectedSignature = signatureCalculator.calculateSignature(
            request.method,
            Uri.create(url),
            timestamp.toInt,
            nonce,
            new util.ArrayList(),
            scala.collection.JavaConversions.seqAsJavaList(params)
          )
          expectedSignature.equals(URLDecoder.decode(providedSignature, "UTF-8"))
        case _ => false
      }
    case _ => false
  }
}

流程如下:

  1. 获取授权标题
  2. 通过提供您的oauth使用者密钥和密钥来创建OAuthSignatureCalculator。在我的情况下,我没有使用任何请求令牌。
  3. 从授权标头中提取所需的oauth参数:signature,nonce,timestamp
  4. 使用OAuthSignatureCalculator计算签名
  5. 将提供的签名与计算的签名进行比较。如果它们匹配,则呼叫者将被认证,否则,它不会。
  6. 希望这可以帮助某人