如何使用scala play在OAuth1.0a上签名?

时间:2013-12-13 21:27:04

标签: scala oauth playframework-2.0

我正在尝试使用Scala和Play 2.2.0实现LTI启动请求(http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html)。它基本上是一个带有表单参数和OAuth签名的HTTP POST。

我可以成功签署POST,但仅限于未添加POST正文。在计算签名时,“OAuthCalculator”类似乎没有使用POST主体。

这不会计算正确的签名。



    val params = Map(
            "lti_message_type" -> Seq("basic-lti-launch-request"),
            "lti_version" -> Seq("LTI-1p0"),
            "launch_presentation_return_url" -> Seq("http://lms.com"),
            "resource_link_id" -> Seq("1023"))

            WS.url("http://myservice:56024/widget")
              .sign(OAuthCalculator(key, RequestToken(null, null)))
              .post(params)

如果没有给POST提供正文,它会正确计算它们。



    WS.url("http://myservice:56024/widget")
      .sign(OAuthCalculator(key, RequestToken(null, null)))
      .post("")

我故意传递一个空的请求令牌,因为我希望计算器只执行OAuth签名。

是否有另一种添加POST正文的方法或其他方法让图书馆对请求进行签名?

1 个答案:

答案 0 :(得分:2)

OAuth Signpost似乎无法使用Scala Play 2.0中使用的标准HTTP请求库对邮件正文中包含的POST参数进行签名。 https://code.google.com/p/oauth-signpost/wiki/GettingStarted#Signing_an_HTTP_message_using_OAuthConsumer请参阅部分中的说明,该部分描述了无法在签名中包含POST邮件正文的原因。

我通过使用Apache HTTP客户端进行同步调用来解决这个问题。



    val params = new util.ArrayList[BasicNameValuePair](1)
    params.add(new BasicNameValuePair("lti_message_type", "basic-lti-launch-request")

    val consumer = new CommonsHttpOauthConsumer("key", "secret")

    val post = new HttpPost("http://stackoverflow.com:8080/service")
    post.addHeader("Content-Type", "application/x-www-form-urlencoded")
    post.setEntity(new UrlEncodedFormEntity(params))

    consumer.sign(post)