Skip to content

Commit f9186ed

Browse files
committed
Modify an error information to include JSON into body response when access token is taken
1 parent 3ab5a36 commit f9186ed

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ trait OAuth2Provider extends Results {
4848
implicit def play2protectedResourceRequest(request: RequestHeader): ProtectedResourceRequest = {
4949
ProtectedResourceRequest(request.headers.toMap, request.queryString)
5050
}
51-
51+
5252
implicit def play2protectedResourceRequest[A](request: Request[A]): ProtectedResourceRequest = {
5353
val param: Map[String, Seq[String]] = getParam(request)
5454
ProtectedResourceRequest(request.headers.toMap, param)
@@ -79,13 +79,13 @@ trait OAuth2Provider extends Results {
7979
*/
8080
def issueAccessToken[A, U](dataHandler: DataHandler[U])(implicit request: play.api.mvc.Request[A]): SimpleResult = {
8181
TokenEndpoint.handleRequest(request, dataHandler) match {
82-
case Left(e) if e.statusCode == 400 => responseOAuthError(BadRequest, e)
83-
case Left(e) if e.statusCode == 401 => responseOAuthError(Unauthorized, e)
82+
case Left(e) if e.statusCode == 400 => BadRequest(responseOAuthErrorJson(e))
83+
case Left(e) if e.statusCode == 401 => Unauthorized(responseOAuthErrorJson(e))
8484
case Right(r) => Ok(Json.toJson(responseAccessToken(r)))
8585
}
8686
}
8787

88-
protected def responseAccessToken(r: GrantHandlerResult) = {
88+
protected[scalaoauth2] def responseAccessToken(r: GrantHandlerResult) = {
8989
Map[String, JsValue](
9090
"token_type" -> JsString(r.tokenType),
9191
"access_token" -> JsString(r.accessToken)
@@ -110,16 +110,19 @@ trait OAuth2Provider extends Results {
110110
*/
111111
def authorize[A, U](dataHandler: DataHandler[U])(callback: AuthInfo[U] => SimpleResult)(implicit request: play.api.mvc.Request[A]): SimpleResult = {
112112
ProtectedResource.handleRequest(request, dataHandler) match {
113-
case Left(e) if e.statusCode == 400 => responseOAuthError(BadRequest, e)
114-
case Left(e) if e.statusCode == 401 => responseOAuthError(Unauthorized, e)
113+
case Left(e) if e.statusCode == 400 => BadRequest.withHeaders(responseOAuthErrorHeader(e))
114+
case Left(e) if e.statusCode == 401 => Unauthorized.withHeaders(responseOAuthErrorHeader(e))
115115
case Right(authInfo) => callback(authInfo)
116116
}
117117
}
118118

119-
protected def responseOAuthError(result: SimpleResult, e: OAuthError) = result.withHeaders(
120-
"WWW-Authenticate" -> ("Bearer " + toOAuthErrorString(e))
119+
protected[scalaoauth2] def responseOAuthErrorJson(e: OAuthError): JsValue = Json.obj(
120+
"error" -> e.errorType,
121+
"error_description" -> e.description
121122
)
122123

124+
protected[scalaoauth2] def responseOAuthErrorHeader(e: OAuthError): (String, String) = ("WWW-Authenticate" -> ("Bearer " + toOAuthErrorString(e)))
125+
123126
protected def toOAuthErrorString(e: OAuthError): String = {
124127
val params = Seq("error=\"" + e.errorType + "\"") ++
125128
(if (!e.description.isEmpty) { Seq("error_description=\"" + e.description + "\"") } else { Nil })
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package scalaoauth2.provider
2+
3+
import org.scalatest._
4+
import org.scalatest.Matchers._
5+
import scala.concurrent.Future
6+
import play.api.libs.json._
7+
8+
class OAuth2ProviderSpec extends FlatSpec {
9+
10+
object TestOAuthProvider extends OAuth2Provider {
11+
override def responseAccessToken(r: GrantHandlerResult) = super.responseAccessToken(r) ++ Map("custom_key" -> JsString("custom_value"))
12+
}
13+
14+
it should "return including access token" in {
15+
val map = TestOAuthProvider.responseAccessToken(GrantHandlerResult(tokenType = "Bearer", accessToken = "access_token", expiresIn = Some(3600), refreshToken = None, scope = None))
16+
map.get("token_type") should contain (JsString("Bearer"))
17+
map.get("access_token") should contain (JsString("access_token"))
18+
map.get("expires_in") should contain (JsNumber(3600))
19+
map.get("refresh_token") should be (None)
20+
map.get("scope") should be (None)
21+
map.get("custom_key") should contain (JsString("custom_value"))
22+
}
23+
24+
it should "return error message as JSON" in {
25+
val json = TestOAuthProvider.responseOAuthErrorJson(new InvalidRequest("request is invalid"))
26+
(json \ "error").as[String] should be ("invalid_request")
27+
(json \ "error_description").as[String] should be ("request is invalid")
28+
}
29+
30+
it should "return error message to header" in {
31+
val (name, value) = TestOAuthProvider.responseOAuthErrorHeader(new InvalidRequest("request is invalid"))
32+
name should be ("WWW-Authenticate")
33+
value should be ("""Bearer error="invalid_request", error_description="request is invalid"""")
34+
}
35+
}

project/Build.scala

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

66
lazy val _organization = "com.nulab-inc"
7-
lazy val _version = "0.5.0"
7+
lazy val _version = "0.5.1"
88
lazy val _playVersion = "2.2.0"
99

1010
val _scalaVersion = "2.10.3"
1111
val _crossScalaVersions = Seq("2.9.3", "2.10.3")
1212

13+
val commonDependenciesInTestScope = Seq(
14+
"org.scalatest" %% "scalatest" % "2.0" % "test"
15+
)
16+
1317
lazy val scalaOAuth2Core = Project(
1418
id = "scala-oauth2-core",
1519
base = file("scala-oauth2-core"),
@@ -22,9 +26,8 @@ object ScalaOAuth2Build extends Build {
2226
crossScalaVersions := _crossScalaVersions,
2327
scalacOptions ++= _scalacOptions,
2428
libraryDependencies ++= Seq(
25-
"commons-codec" % "commons-codec" % "1.8",
26-
"org.scalatest" %% "scalatest" % "2.0" % "test"
27-
),
29+
"commons-codec" % "commons-codec" % "1.8"
30+
) ++ commonDependenciesInTestScope,
2831
publishTo <<= version { (v: String) => _publishTo(v) },
2932
publishMavenStyle := true,
3033
publishArtifact in Test := false,
@@ -47,7 +50,7 @@ object ScalaOAuth2Build extends Build {
4750
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/",
4851
libraryDependencies ++= Seq(
4952
"com.typesafe.play" %% "play" % _playVersion % "provided"
50-
),
53+
) ++ commonDependenciesInTestScope,
5154
publishTo <<= version { (v: String) => _publishTo(v) },
5255
publishMavenStyle := true,
5356
publishArtifact in Test := false,

0 commit comments

Comments
 (0)