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