Skip to content

Commit 547222f

Browse files
committed
added to be able to get authInfo on issue access token
1 parent ddbdf5b commit 547222f

File tree

4 files changed

+36
-19
lines changed

4 files changed

+36
-19
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ trait OAuth2BaseProvider extends Results {
6363

6464
}
6565

66-
protected[scalaoauth2] def responseAccessToken(r: GrantHandlerResult) = {
66+
protected[scalaoauth2] def responseAccessToken[U](r: GrantHandlerResult[U]) = {
6767
Map[String, JsValue](
6868
"token_type" -> JsString(r.tokenType),
6969
"access_token" -> JsString(r.accessToken)

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,23 @@ import play.api.test.{ FakeHeaders, FakeRequest }
88

99
class OAuth2ProviderSpec extends FlatSpec {
1010

11+
case class User(id: Long, name: String)
12+
1113
object TestOAuthProvider extends OAuth2Provider {
12-
override def responseAccessToken(r: GrantHandlerResult) = super.responseAccessToken(r) ++ Map("custom_key" -> JsString("custom_value"))
14+
override def responseAccessToken[U](r: GrantHandlerResult[U]) = super.responseAccessToken(r) ++ Map("custom_key" -> JsString("custom_value"))
1315
}
1416

1517
it should "return including access token" in {
16-
val map = TestOAuthProvider.responseAccessToken(GrantHandlerResult(tokenType = "Bearer", accessToken = "access_token", expiresIn = Some(3600), refreshToken = None, scope = None))
18+
val map = TestOAuthProvider.responseAccessToken(
19+
GrantHandlerResult(
20+
authInfo = AuthInfo[User](user = User(0L, "name"), Some("client_id"), None, None),
21+
tokenType = "Bearer",
22+
accessToken = "access_token",
23+
expiresIn = Some(3600),
24+
refreshToken = None,
25+
scope = None
26+
)
27+
)
1728
map.get("token_type") should contain(JsString("Bearer"))
1829
map.get("access_token") should contain(JsString("access_token"))
1930
map.get("expires_in") should contain(JsNumber(3600))

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

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ package scalaoauth2.provider
33
import scala.concurrent.Future
44
import scala.concurrent.ExecutionContext.Implicits.global
55

6-
case class GrantHandlerResult(tokenType: String, accessToken: String, expiresIn: Option[Long], refreshToken: Option[String], scope: Option[String])
6+
case class GrantHandlerResult[U](
7+
authInfo: AuthInfo[U],
8+
tokenType: String,
9+
accessToken: String,
10+
expiresIn: Option[Long],
11+
refreshToken: Option[String],
12+
scope: Option[String])
713

814
trait GrantHandler {
915
/**
@@ -13,12 +19,12 @@ trait GrantHandler {
1319
*/
1420
def clientCredentialRequired = true
1521

16-
def handleRequest[U](request: AuthorizationRequest, authorizationHandler: AuthorizationHandler[U]): Future[GrantHandlerResult]
22+
def handleRequest[U](request: AuthorizationRequest, authorizationHandler: AuthorizationHandler[U]): Future[GrantHandlerResult[U]]
1723

1824
/**
1925
* Returns valid access token.
2026
*/
21-
protected def issueAccessToken[U](handler: AuthorizationHandler[U], authInfo: AuthInfo[U]): Future[GrantHandlerResult] = {
27+
protected def issueAccessToken[U](handler: AuthorizationHandler[U], authInfo: AuthInfo[U]): Future[GrantHandlerResult[U]] = {
2228
handler.getStoredAccessToken(authInfo).flatMap {
2329
case Some(token) if shouldRefreshAccessToken(token) => token.refreshToken.map {
2430
handler.refreshAccessToken(authInfo, _)
@@ -27,12 +33,13 @@ trait GrantHandler {
2733
}
2834
case Some(token) => Future.successful(token)
2935
case None => handler.createAccessToken(authInfo)
30-
}.map(createGrantHandlerResult)
36+
}.map(createGrantHandlerResult(authInfo, _))
3137
}
3238

3339
protected def shouldRefreshAccessToken(token: AccessToken) = token.isExpired
3440

35-
protected def createGrantHandlerResult(accessToken: AccessToken) = GrantHandlerResult(
41+
protected def createGrantHandlerResult[U](authInfo: AuthInfo[U], accessToken: AccessToken) = GrantHandlerResult(
42+
authInfo,
3643
"Bearer",
3744
accessToken.token,
3845
accessToken.expiresIn,
@@ -44,7 +51,7 @@ trait GrantHandler {
4451

4552
class RefreshToken extends GrantHandler {
4653

47-
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult] = {
54+
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult[U]] = {
4855
val refreshTokenRequest = new RefreshTokenRequest(request)
4956
val clientCredential = refreshTokenRequest.clientCredential.getOrElse(throw new InvalidRequest("Client credential is required"))
5057
val refreshToken = refreshTokenRequest.refreshToken
@@ -55,14 +62,14 @@ class RefreshToken extends GrantHandler {
5562
throw new InvalidClient
5663
}
5764

58-
handler.refreshAccessToken(authInfo, refreshToken).map(createGrantHandlerResult)
65+
handler.refreshAccessToken(authInfo, refreshToken).map(createGrantHandlerResult(authInfo, _))
5966
}
6067
}
6168
}
6269

6370
class Password extends GrantHandler {
6471

65-
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult] = {
72+
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult[U]] = {
6673
val passwordRequest = new PasswordRequest(request)
6774
if (clientCredentialRequired && passwordRequest.clientCredential.isEmpty) {
6875
throw new InvalidRequest("Client credential is required")
@@ -81,7 +88,7 @@ class Password extends GrantHandler {
8188

8289
class ClientCredentials extends GrantHandler {
8390

84-
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult] = {
91+
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult[U]] = {
8592
val clientCredentialsRequest = new ClientCredentialsRequest(request)
8693
val clientCredential = clientCredentialsRequest.clientCredential.getOrElse(throw new InvalidRequest("Client credential is required"))
8794
val scope = clientCredentialsRequest.scope
@@ -98,7 +105,7 @@ class ClientCredentials extends GrantHandler {
98105

99106
class AuthorizationCode extends GrantHandler {
100107

101-
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult] = {
108+
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult[U]] = {
102109
val authorizationCodeRequest = new AuthorizationCodeRequest(request)
103110
val clientCredential = authorizationCodeRequest.clientCredential.getOrElse(throw new InvalidRequest("Client credential is required"))
104111
val clientId = clientCredential.clientId
@@ -125,7 +132,7 @@ class AuthorizationCode extends GrantHandler {
125132

126133
class Implicit extends GrantHandler {
127134

128-
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult] = {
135+
override def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[GrantHandlerResult[U]] = {
129136
val implicitRequest = new ImplicitRequest(request)
130137
val clientCredential = implicitRequest.clientCredential.getOrElse(throw new InvalidRequest("Client credential is required"))
131138

@@ -146,6 +153,7 @@ class Implicit extends GrantHandler {
146153
/**
147154
* Implicit grant must not return refresh token
148155
*/
149-
protected override def createGrantHandlerResult(accessToken: AccessToken) = super.createGrantHandlerResult(accessToken).copy(refreshToken = None)
156+
protected override def createGrantHandlerResult[U](authInfo: AuthInfo[U], accessToken: AccessToken) =
157+
super.createGrantHandlerResult(authInfo, accessToken).copy(refreshToken = None)
150158

151159
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package scalaoauth2.provider
22

3-
import scala.concurrent.Future
43
import scala.concurrent.ExecutionContext.Implicits.global
5-
6-
import scalaoauth2.provider.OAuthGrantType._
4+
import scala.concurrent.Future
75

86
trait TokenEndpoint {
97
val handlers = Map.empty[String, GrantHandler]
108

11-
def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[Either[OAuthError, GrantHandlerResult]] = try {
9+
def handleRequest[U](request: AuthorizationRequest, handler: AuthorizationHandler[U]): Future[Either[OAuthError, GrantHandlerResult[U]]] = try {
1210
val grantType = request.grantType
1311
val grantHandler = handlers.getOrElse(grantType, throw new UnsupportedGrantType(s"${grantType} is not supported"))
1412

0 commit comments

Comments
 (0)