Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions oauth2-server-jwt/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>kotlin-oauth2-server</artifactId>
<groupId>nl.myndocs</groupId>
<version>0.3.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>oauth2-server-jwt</artifactId>

<dependencies>
<dependency>
<groupId>nl.myndocs</groupId>
<artifactId>oauth2-server-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.5.0</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package nl.myndocs.convert

import com.auth0.jwt.JWT
import java.time.Instant
import java.util.*

object DefaultJwtBuilder : JwtBuilder {
override fun buildJwt(username: String?, clientId: String, requestedScopes: Set<String>, expiresInSeconds: Long) =
JWT.create()
.withIssuedAt(Date.from(Instant.now()))
.withExpiresAt(
Date.from(
Instant.now()
.plusSeconds(expiresInSeconds)
)
)
.withClaim("client_id", clientId)
.withArrayClaim("scopes", requestedScopes.toTypedArray())
.let { withBuilder -> if (username != null) withBuilder.withClaim("username", username) else withBuilder }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package nl.myndocs.convert

import com.auth0.jwt.algorithms.Algorithm
import nl.myndocs.oauth2.token.AccessToken
import nl.myndocs.oauth2.token.RefreshToken
import nl.myndocs.oauth2.token.converter.AccessTokenConverter
import java.time.Instant

class JwtAccessTokenConverter(
private val algorithm: Algorithm,
private val accessTokenExpireInSeconds: Int = 3600,
private val jwtBuilder: JwtBuilder = DefaultJwtBuilder
) : AccessTokenConverter {
override fun convertToToken(username: String?, clientId: String, requestedScopes: Set<String>, refreshToken: RefreshToken?): AccessToken {
val jwtBuilder = jwtBuilder.buildJwt(
username,
clientId,
requestedScopes,
accessTokenExpireInSeconds.toLong()
)

return AccessToken(
jwtBuilder.sign(algorithm),
"bearer",
Instant.now().plusSeconds(accessTokenExpireInSeconds.toLong()),
username,
clientId,
requestedScopes,
refreshToken
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package nl.myndocs.convert

import com.auth0.jwt.JWTCreator

interface JwtBuilder {
fun buildJwt(username: String?, clientId: String, requestedScopes: Set<String>, expiresInSeconds: Long): JWTCreator.Builder
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package nl.myndocs.convert

import com.auth0.jwt.algorithms.Algorithm
import nl.myndocs.oauth2.token.RefreshToken
import nl.myndocs.oauth2.token.converter.RefreshTokenConverter
import java.time.Instant

class JwtRefreshTokenConverter(
private val algorithm: Algorithm,
private val refreshTokenExpireInSeconds: Int = 86400,
private val jwtBuilder: JwtBuilder = DefaultJwtBuilder
) : RefreshTokenConverter {
override fun convertToToken(username: String?, clientId: String, requestedScopes: Set<String>): RefreshToken {
val jwtBuilder = jwtBuilder.buildJwt(
username,
clientId,
requestedScopes,
refreshTokenExpireInSeconds.toLong()
)

return RefreshToken(
jwtBuilder.sign(algorithm),
Instant.now().plusSeconds(refreshTokenExpireInSeconds.toLong()),
username,
clientId,
requestedScopes
)
}
}
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<module>oauth2-server-javalin</module>
<module>oauth2-server-sparkjava</module>
<module>oauth2-server-http4k</module>
<module>oauth2-server-jwt</module>
</modules>

<dependencies>
Expand Down