我必须验证来自OAuth签名的服务器的请求调用。此请求调用发送到我的服务器,我需要验证是否从该服务器发出请求。我有oauth消费者密钥和消费者秘密。我一直在寻找路标和球衣库API进行签名验证。他们没有太多帮助。 调用是从特定服务器(具有两条腿OAuth 1.0)到我的servlet。请建议一个更简单的库或示例来进行OAuth验证。
答案 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
}
}
流程如下:
希望这可以帮助某人