Java 验证OAuth签名或请求

Java 验证OAuth签名或请求,java,servlets,oauth,Java,Servlets,Oauth,我必须验证来自OAuth签名服务器的请求调用。此请求调用是向我的服务器发出的,我需要验证请求是否是从该服务器发出的。我有oauth用户密钥和用户机密。我一直在研究用于签名验证的路标和jersey库API。他们帮不了什么忙。 该调用是从一个特定的服务器(使用两条腿的OAuth 1.0)调用我的servlet。请推荐一个更简单的库或示例来执行OAuth验证 在Scala中使用Play框架编写web服务时,我遇到了同样的问题,我必须使用Java库编写代码才能解决这个问题。因此,即使我的代码片段在Sca

我必须验证来自OAuth签名服务器的请求调用。此请求调用是向我的服务器发出的,我需要验证请求是否是从该服务器发出的。我有oauth用户密钥和用户机密。我一直在研究用于签名验证的路标和jersey库API。他们帮不了什么忙。
该调用是从一个特定的服务器(使用两条腿的OAuth 1.0)调用我的servlet。请推荐一个更简单的库或示例来执行OAuth验证

在Scala中使用Play框架编写web服务时,我遇到了同样的问题,我必须使用Java库编写代码才能解决这个问题。因此,即使我的代码片段在Scala中,我认为它也会有所帮助。这个答案可能来得有点晚,但希望有人会发现它有用

在我的例子中,一个外部服务正在调用我的REST端点,同时在授权头中提供不同的oauth参数。为了验证作为这些参数的一部分提供的oauth_签名,我必须从报头中提取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
  }
}
流程如下所示:

  • 抓取授权头
  • 通过提供oauth使用者密钥和密码来创建OAuthSignatureCalculator。在我的情况下,我没有使用任何请求令牌
  • 从授权头中提取所需的oauth参数:签名、nonce、时间戳
  • 使用OAuthSignatureCalculator计算签名
  • 将提供的签名与计算的签名进行比较。如果它们匹配,则调用方已被身份验证,否则,调用方未被身份验证
  • 希望这能帮助一些人