Skip to content

Commit 54a1297

Browse files
committed
Merge pull request #63 from tsuyoshizawa/support-json-body
support JSON body #62
2 parents 2e4d58f + 50f7b89 commit 54a1297

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

play2-oauth2-provider/src/main/scala/scalaoauth2/provider/OAuth2Provider.scala

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,34 @@ trait OAuth2BaseProvider extends Results {
3333
ProtectedResourceRequest(request.headers.toMap, param)
3434
}
3535

36-
final def getParam[A](request: Request[A]): Map[String, Seq[String]] = {
37-
val form = request.body match {
36+
private[provider] def getParam[A](request: Request[A]): Map[String, Seq[String]] = {
37+
(request.body match {
3838
case body: play.api.mvc.AnyContent if body.asFormUrlEncoded.isDefined => body.asFormUrlEncoded.get
3939
case body: play.api.mvc.AnyContent if body.asMultipartFormData.isDefined => body.asMultipartFormData.get.asFormUrlEncoded
40+
case body: play.api.mvc.AnyContent if body.asJson.isDefined => FormUtils.fromJson(js = body.asJson.get).mapValues(Seq(_))
4041
case body: Map[_, _] => body.asInstanceOf[Map[String, Seq[String]]]
4142
case body: play.api.mvc.MultipartFormData[_] => body.asFormUrlEncoded
43+
case body: play.api.libs.json.JsValue => FormUtils.fromJson(js = body).mapValues(Seq(_))
4244
case _ => Map.empty[String, Seq[String]]
43-
}
45+
}) ++ request.queryString
46+
}
47+
48+
private[provider] object FormUtils {
4449

45-
form ++ request.queryString.map {
46-
case (k, v) => k -> (v ++ form.getOrElse(k, Nil))
50+
import play.api.libs.json._
51+
52+
def fromJson(prefix: String = "", js: JsValue): Map[String, String] = js match {
53+
case JsObject(fields) =>
54+
fields.map { case (key, value) => fromJson(Option(prefix).filterNot(_.isEmpty).map(_ + ".").getOrElse("") + key, value) }.foldLeft(Map.empty[String, String])(_ ++ _)
55+
case JsArray(values) =>
56+
values.zipWithIndex.map { case (value, i) => fromJson(prefix + "[" + i + "]", value) }.foldLeft(Map.empty[String, String])(_ ++ _)
57+
case JsNull => Map.empty
58+
case JsUndefined() => Map.empty
59+
case JsBoolean(value) => Map(prefix -> value.toString)
60+
case JsNumber(value) => Map(prefix -> value.toString)
61+
case JsString(value) => Map(prefix -> value.toString)
4762
}
63+
4864
}
4965

5066
protected[scalaoauth2] def responseAccessToken(r: GrantHandlerResult) = {

play2-oauth2-provider/src/test/scala/scalaoauth2/provider/OAuth2ProviderSpec.scala

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package scalaoauth2.provider
22

3-
import org.scalatest._
43
import org.scalatest.Matchers._
5-
import scala.concurrent.Future
4+
import org.scalatest._
65
import play.api.libs.json._
6+
import play.api.mvc.{AnyContentAsFormUrlEncoded, AnyContentAsJson}
7+
import play.api.test.{FakeHeaders, FakeRequest}
78

89
class OAuth2ProviderSpec extends FlatSpec {
910

@@ -32,4 +33,38 @@ class OAuth2ProviderSpec extends FlatSpec {
3233
name should be ("WWW-Authenticate")
3334
value should be ("""Bearer error="invalid_request", error_description="request is invalid"""")
3435
}
36+
37+
it should "get parameters from form url encoded body" in {
38+
val values = Map(
39+
"id" -> List("1000"),
40+
"language" -> List("Scala")
41+
)
42+
val request = FakeRequest(method = "GET", uri = "/", headers = FakeHeaders(), body = AnyContentAsFormUrlEncoded(values))
43+
val params = TestOAuthProvider.getParam(request)
44+
params.get("id") should contain (List("1000"))
45+
params.get("language") should contain (List("Scala"))
46+
}
47+
48+
it should "get parameters from query string" in {
49+
val values = Map(
50+
"id" -> List("1000"),
51+
"language" -> List("Scala")
52+
)
53+
val request = FakeRequest(method = "GET", uri = "/?version=2.11", headers = FakeHeaders(), body = AnyContentAsFormUrlEncoded(values))
54+
val params = TestOAuthProvider.getParam(request)
55+
params.get("id") should contain (List("1000"))
56+
params.get("language") should contain (List("Scala"))
57+
params.get("version") should contain (List("2.11"))
58+
}
59+
60+
it should "get parameters from JSON body" in {
61+
val json = Json.obj(
62+
"id" -> 1000,
63+
"language" -> "Scala"
64+
)
65+
val request = FakeRequest(method = "GET", uri = "/", headers = FakeHeaders(), body = AnyContentAsJson(json))
66+
val params = TestOAuthProvider.getParam(request)
67+
params.get("id") should contain (List("1000"))
68+
params.get("language") should contain (List("Scala"))
69+
}
3570
}

project/Build.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Keys._
44
object ScalaOAuth2Build extends Build {
55

66
lazy val _organization = "com.nulab-inc"
7-
lazy val _version = "0.13.2"
7+
lazy val _version = "0.13.3-SNAPSHOT"
88
lazy val _playVersion = "2.3.7"
99

1010
val _scalaVersion = "2.10.5"
@@ -14,7 +14,7 @@ object ScalaOAuth2Build extends Build {
1414
"org.scalatest" %% "scalatest" % "2.2.4" % "test"
1515
)
1616

17-
lazy val scalaOAuth2ProviderSettings = Defaults.defaultSettings ++ Seq(
17+
lazy val scalaOAuth2ProviderSettings = Defaults.coreDefaultSettings ++ Seq(
1818
organization := _organization,
1919
version := _version,
2020
scalaVersion := _scalaVersion,

0 commit comments

Comments
 (0)