From 47cb113c8d7ae317db3e8a01e2f709c9769d5518 Mon Sep 17 00:00:00 2001 From: Override-6 Date: Sat, 28 Jan 2023 16:55:05 +0100 Subject: [PATCH] working on jwt --- Core/resources/log4j2.xml | 40 +++++++++++++++++++ Core/src/module-info.java | 2 + JWTEmitter/resources/log4j2.xml | 32 +++++++++++++++ .../src/org/tbasket/jwt/JwtGenerator.scala | 15 +++++-- JWTEmitter/src/org/tbasket/jwt/Main.scala | 24 +++++------ build.sc | 7 +++- 6 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 Core/resources/log4j2.xml create mode 100644 Core/src/module-info.java create mode 100644 JWTEmitter/resources/log4j2.xml diff --git a/Core/resources/log4j2.xml b/Core/resources/log4j2.xml new file mode 100644 index 0000000..f045e3d --- /dev/null +++ b/Core/resources/log4j2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Core/src/module-info.java b/Core/src/module-info.java new file mode 100644 index 0000000..26182a6 --- /dev/null +++ b/Core/src/module-info.java @@ -0,0 +1,2 @@ +module core { +} \ No newline at end of file diff --git a/JWTEmitter/resources/log4j2.xml b/JWTEmitter/resources/log4j2.xml new file mode 100644 index 0000000..4323e8a --- /dev/null +++ b/JWTEmitter/resources/log4j2.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JWTEmitter/src/org/tbasket/jwt/JwtGenerator.scala b/JWTEmitter/src/org/tbasket/jwt/JwtGenerator.scala index 18b9eee..1180ae0 100644 --- a/JWTEmitter/src/org/tbasket/jwt/JwtGenerator.scala +++ b/JWTEmitter/src/org/tbasket/jwt/JwtGenerator.scala @@ -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") + \ No newline at end of file diff --git a/JWTEmitter/src/org/tbasket/jwt/Main.scala b/JWTEmitter/src/org/tbasket/jwt/Main.scala index 1f78be9..1c3d252 100644 --- a/JWTEmitter/src/org/tbasket/jwt/Main.scala +++ b/JWTEmitter/src/org/tbasket/jwt/Main.scala @@ -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 diff --git a/build.sc b/build.sc index d32a34c..5608c5e 100644 --- a/build.sc +++ b/build.sc @@ -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