working on jwt
continuous-integration/drone/push Build is failing Details

drone-setup
Override-6 2 years ago
parent 99f182502a
commit 47cb113c8d

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout disableAnsi="false"
pattern="%style{[%d{HH:mm:ss,SSS}]}{magenta} [%highlight{%-5p}{FATAL=red, ERROR=red, WARN=yellow, INFO=blue, DEBUG=green, TRACE=normal} _ %-6logger] %style{-}{normal} %highlight{%m%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=blue, DEBUG=green, TRACE=normal}"/>
</Console>
<RollingFile name="LogFile"
fileName="log/server-current.log"
filePattern="log/archives/server-%d{yyyy-MM-dd}.log"
append="true">
<PatternLayout disableAnsi="false"
pattern="[%d{HH:mm:ss,SSS}] [%-5p _ %-6logger] - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="Database" additivity="false" includeLocation="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Logger>
<Logger name="Endpoint" additivity="false" includeLocation="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Logger>
<Logger name="Core" additivity="false" includeLocation="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Logger>
<Root level="ALL" includeLocation="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Root>
</Loggers>
</Configuration>

@ -0,0 +1,2 @@
module core {
}

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout disableAnsi="false"
pattern="%style{[%d{HH:mm:ss,SSS}]}{magenta} [%highlight{%-5p}{FATAL=red, ERROR=red, WARN=yellow, INFO=blue, DEBUG=green, TRACE=normal} _ %-6logger] %style{-}{normal} %highlight{%m%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=blue, DEBUG=green, TRACE=normal}"/>
</Console>
<RollingFile name="LogFile"
fileName="log/server-current.log"
filePattern="log/archives/server-%d{yyyy-MM-dd}.log"
append="true">
<PatternLayout disableAnsi="false"
pattern="[%d{HH:mm:ss,SSS}] [%-5p _ %-6logger] - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="JWTEmitter" additivity="false" includeLocation="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Logger>
<Root level="ALL" includeLocation="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="LogFile"/>
</Root>
</Loggers>
</Configuration>

@ -1,5 +1,8 @@
package org.tbasket.jwt
import org.apache.logging.log4j.LogManager
import org.slf4j.LoggerFactory
import org.tbasket.jwt.JwtGenerator.LOG
import pdi.jwt.*
import pdi.jwt.algorithms.JwtAsymmetricAlgorithm
import zio.*
@ -12,16 +15,17 @@ import zio.json.ast.Json
import java.lang.System.currentTimeMillis
import java.nio.file.*
import java.security.cert.CertificateFactory
import java.security.{Key, PrivateKey}
import java.security.interfaces.RSAPrivateKey
import java.security.spec.PKCS8EncodedKeySpec
import java.security.{Key, PrivateKey}
import java.time.Duration
import java.util.concurrent.TimeUnit
import java.util.{Date, UUID}
import javax.crypto.SecretKey
import java.time.Duration
class JwtGenerator(tokenLifespan: Duration, key: PrivateKey, algorithm: JwtAsymmetricAlgorithm):
private def claims(content: String) = JwtClaim(
expiration = Some(currentTimeMillis() + tokenLifespan.toMillis),
issuedAt = Some(currentTimeMillis()),
@ -34,9 +38,14 @@ class JwtGenerator(tokenLifespan: Duration, key: PrivateKey, algorithm: JwtAsymm
for
claims <- request.body.asString.map(claims)
response <- ZIO.attempt(JwtZIOJson.encode(claims, key, algorithm))
.map(Response.json)
.map(Response.text)
.catchAll(e => {
ZIO.attempt(e.printStackTrace()).as(Response.status(InternalServerError))
})
yield
LOG.info(s"Generated jwt:\n${claims.toJson}")
response
object JwtGenerator:
private val LOG = LogManager.getLogger("JWTEmitter")

@ -1,5 +1,6 @@
package org.tbasket.jwt
import org.slf4j.LoggerFactory
import pdi.jwt.JwtAlgorithm
import pdi.jwt.algorithms.JwtUnknownAlgorithm
import zio.*
@ -10,19 +11,21 @@ import zio.stream.*
import java.nio.file.{Files, Path}
import java.security.{KeyFactory, PrivateKey}
import java.security.spec.{
KeySpec,
PKCS8EncodedKeySpec,
RSAPrivateKeySpec,
X509EncodedKeySpec
}
import java.security.spec.{KeySpec, PKCS8EncodedKeySpec, RSAPrivateKeySpec, X509EncodedKeySpec}
import java.time.Duration
import scala.util.chaining.scalaUtilChainingOps
object Main extends ZIOAppDefault:
private val KeyFactory = java.security.KeyFactory.getInstance("RSA")
private val app = Http.collectZIO[Request] {
case r@(Method.GET | Method.POST) -> _ / "jwt" =>
ZIO.serviceWithZIO[JwtGenerator](_.generateTokenResponse(r))
case _ =>
ZIO.succeed(Response(status = Status.NotFound))
}
private def parsePort(port: Option[String]): Task[Int] =
port match
case None => ZIO.dieMessage("Must provide the port argument")
@ -51,12 +54,7 @@ object Main extends ZIOAppDefault:
}
parsePort(port) <&> loadKey(keyFile)
private val app = Http.collectZIO[Request] {
case r @ Method.GET -> _ / "jwt" =>
ZIO.serviceWithZIO[JwtGenerator](_.generateTokenResponse(r))
case _ =>
ZIO.succeed(Response(status = Status.NotFound))
}
private def startServer(port: Int, key: PrivateKey) =
val config = ServerConfig.default

@ -8,7 +8,9 @@ trait ServerModule extends ScalaModule with ScalafmtModule {
override def ivyDeps = Agg(
ivy"dev.zio::zio:2.0.6",
ivy"org.apache.logging.log4j:log4j-slf4j-impl:2.19.0"
ivy"org.apache.logging.log4j:log4j-slf4j-impl:2.19.0",
ivy"org.apache.logging.log4j:log4j-core:2.19.0",
ivy"org.apache.logging.log4j:log4j-api:2.19.0",
)
}
@ -28,7 +30,8 @@ trait HttpModule extends ServerModule {
/**
* Simple module whose only job is to generate JWT Tokens
* */
object JWTEmitter extends HttpModule
object JWTEmitter extends HttpModule {
}
/**
* Business layer of a server