如何使用 scala play 使用 OAuth1.0a 签署 POST?

2024-01-12

我正在尝试实施 LTI 启动请求(http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html)使用 Scala 和 Play 2.2.0。它基本上是一个带有表单参数和 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 正文的方法或另一种让库签署请求的方法?


OAuth Signpost 似乎不可能使用 Scala Play 2.0 中使用的标准 HTTP 请求库对消息正文中包含的 POST 参数进行签名。https://code.google.com/p/oauth-signpost/wiki/GettingStarted#Signing_an_HTTP_message_using_OAuthConsumer 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)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 scala play 使用 OAuth1.0a 签署 POST? 的相关文章

随机推荐