Skip to content

Commit c120d6a

Browse files
committed
enhance validating to parse Authentication header
1 parent 733dc68 commit c120d6a

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

scala-oauth2-core/src/main/scala/scalaoauth2/provider/ClientCredentialFetcher.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,24 @@ case class ClientCredential(clientId: String, clientSecret: String)
66

77
trait ClientCredentialFetcher {
88

9+
val REGEXP_AUTHORIZATION = """^\s*Basic\s+(.+?)\s*$""".r
10+
911
def fetch(request: AuthorizationRequest): Option[ClientCredential] = {
10-
request.header("Authorization") match {
11-
case Some(authorization) if authorization.length > 5 => {
12-
val decoded = new String(Base64.decodeBase64(authorization.substring(6).getBytes), "UTF-8")
12+
request.header("Authorization").flatMap {
13+
REGEXP_AUTHORIZATION.findFirstMatchIn
14+
} match {
15+
case Some(matcher) =>
16+
val authorization = matcher.group(1)
17+
val decoded = new String(Base64.decodeBase64(authorization.getBytes), "UTF-8")
1318
if (decoded.indexOf(':') > 0) {
1419
decoded.split(":", 2) match {
15-
case Array(clientId, clientSecret) => Option(ClientCredential(clientId, clientSecret))
16-
case Array(clientId) => Option(ClientCredential(clientId, ""))
20+
case Array(clientId, clientSecret) => Some(ClientCredential(clientId, clientSecret))
21+
case Array(clientId) => Some(ClientCredential(clientId, ""))
1722
case _ => None
1823
}
1924
} else {
2025
None
2126
}
22-
}
2327
case _ => request.clientId.map { clientId =>
2428
ClientCredential(clientId, request.clientSecret.getOrElse(""))
2529
}

scala-oauth2-core/src/test/scala/scalaoauth2/provider/ClientCredentialFetcherSpec.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class ClientCredentialFetcherSpec extends FlatSpec {
1818
c.clientId should be ("client_id_value")
1919
c.clientSecret should be ("client_secret_value")
2020
}
21-
21+
2222
it should "fetch empty client_secret" in {
2323
val request = AuthorizationRequest(Map("Authorization" -> Seq("Basic Y2xpZW50X2lkX3ZhbHVlOg==")), Map())
2424
val Some(c) = ClientCredentialFetcher.fetch(request)
@@ -31,7 +31,7 @@ class ClientCredentialFetcherSpec extends FlatSpec {
3131
ClientCredentialFetcher.fetch(request) should be (None)
3232
}
3333

34-
it should "not fetch invalidate Base64" in {
34+
it should "not fetch invalid Base64" in {
3535
val request = AuthorizationRequest(Map("Authorization" -> Seq("Basic basic")), Map())
3636
ClientCredentialFetcher.fetch(request) should be (None)
3737
}
@@ -48,7 +48,7 @@ class ClientCredentialFetcherSpec extends FlatSpec {
4848
c.clientId should be ("client_id_value")
4949
c.clientSecret should be ("")
5050
}
51-
51+
5252
it should "not fetch missing parameter" in {
5353
ClientCredentialFetcher.fetch(AuthorizationRequest(Map(), Map("client_secret" -> Seq("client_secret_value")))) should be (None)
5454
}
@@ -57,4 +57,14 @@ class ClientCredentialFetcherSpec extends FlatSpec {
5757
val request = AuthorizationRequest(Map("Authorization" -> Seq("")), Map())
5858
ClientCredentialFetcher.fetch(request) should be (None)
5959
}
60+
61+
it should "fetch parameter with invalid header" in {
62+
val request = AuthorizationRequest(
63+
Map("Authorization" -> Seq("fakeheader aaaa")),
64+
Map("client_id" -> Seq("client_id_value"), "client_secret" -> Seq("client_secret_value"))
65+
)
66+
val Some(c) = ClientCredentialFetcher.fetch(request)
67+
c.clientId should be ("client_id_value")
68+
c.clientSecret should be ("client_secret_value")
69+
}
6070
}

0 commit comments

Comments
 (0)