首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证OAuth签名或请求

验证OAuth签名或请求
EN

Stack Overflow用户
提问于 2015-02-02 12:57:08
回答 1查看 1.7K关注 0票数 2

我必须验证来自OAuth签名的服务器的请求调用。这个请求调用是对我的服务器进行的,我需要验证该请求是从该服务器发出的。我有oauth消费者的密钥和消费者的秘密。我一直在研究路标和泽西图书馆API的签名验证。他们帮不了多少忙。调用是从一个特定的服务器(使用两条腿的OAuth 1.0)向我的servlet发出的。请建议一个更简单的库或示例来进行OAuth验证。

EN

Stack Overflow用户

发布于 2015-11-26 17:13:45

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

在我的示例中,外部服务正在调用我的REST端点,同时在授权头中提供不同的oauth参数。为了验证作为这些参数的一部分而提供的oauth_signature,我必须从报头中提取nonce和时间戳参数,并根据它们再加上其他一些参数(包括oauth密钥和机密以及原始请求uri )计算一个签名。

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

代码语言:javascript
运行
复制
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参数:签名、当前、时间戳
  4. 使用OAuthSignatureCalculator计算签名
  5. 将提供的签名与计算的签名进行比较。如果它们匹配,调用者就会被认证,否则就不会。

希望这能帮到别人

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28278262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档