Create JWT Usertoken when use register, and starting bet action
continuous-integration/drone/push Build is passing Details

pull/4/head
luevard 1 year ago
parent 2f4d5143f2
commit 3bce3356e7

@ -220,6 +220,14 @@
</dependency> </dependency>
</dependencies> </dependencies>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

@ -1,5 +1,6 @@
package allin package allin
import allin.model.User
import allin.routing.BasicRouting import allin.routing.BasicRouting
import allin.routing.BetRouter import allin.routing.BetRouter
import allin.routing.UserRouter import allin.routing.UserRouter
@ -22,7 +23,7 @@ fun main() {
private fun Application.extracted() { private fun Application.extracted() {
val config = HoconApplicationConfig(ConfigFactory.load()) val config = HoconApplicationConfig(ConfigFactory.load())
val tokenManager= TokenManager(config) val tokenManager = TokenManager.getInstance(config)
authentication { authentication {
jwt { jwt {
verifier(tokenManager.verifyJWTToken()) verifier(tokenManager.verifyJWTToken())

@ -1,11 +1,19 @@
package allin.model package allin.model
import allin.dto.UserDTOWithToken
import allin.serializer.DateSerializer import allin.serializer.DateSerializer
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import java.util.* import java.util.*
@Serializable @Serializable
data class Bet(val id: Int, val theme: String, val sentenceBet: String, @Serializable(DateSerializer::class) val endRegistration: Date, @Serializable(DateSerializer::class) var endBet : Date, var isPrivate : Boolean, var response : MutableList<String>) data class Bet(val id: Int, val theme: String, val sentenceBet: String, @Serializable(DateSerializer::class) val endRegistration: Date, @Serializable(DateSerializer::class) var endBet : Date, var isPrivate : Boolean, var response : MutableList<String>, val createdBy : String)
@Serializable @Serializable
data class UpdatedBetData(val id: Int,@Serializable(DateSerializer::class) val endBet: Date, val isPrivate: Boolean, val response: MutableList<String>) data class UpdatedBetData(val id: Int,@Serializable(DateSerializer::class) val endBet: Date, val isPrivate: Boolean, val response: MutableList<String>)
@Serializable
data class BetWithoutId(val theme: String, val sentenceBet: String, @Serializable(DateSerializer::class) val endRegistration: Date, @Serializable(DateSerializer::class) var endBet : Date, var isPrivate : Boolean, var response : MutableList<String>, val createdBy : String)
fun convertBetWithoutIdToBet(betWithoutId: BetWithoutId,id : Int, username : String): Bet {
return Bet(id,betWithoutId.theme,betWithoutId.sentenceBet,betWithoutId.endRegistration, betWithoutId.endBet, betWithoutId.isPrivate, betWithoutId.response, username)
}

@ -0,0 +1,5 @@
package allin.model
import allin.dto.UserDTOWithToken
data class BetAction(val id:Int, val coins: Int, val user: String, val bet: Int)
data class BetActionCompleted(val id:Int, val coins: Int, val user: UserDTOWithToken, val bet: Bet)

@ -1,5 +1,6 @@
package allin.model package allin.model
import allin.dto.UserDTO
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable

@ -0,0 +1,13 @@
package allin.routing
import allin.model.BetAction
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
fun Application.BetActionRouter(){
routing {
route("/BetAction/add"){
}
}
}

@ -3,19 +3,29 @@ import io.ktor.server.application.*
import io.ktor.server.request.* import io.ktor.server.request.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import allin.model.* import allin.model.*
import allin.utils.AppConfig
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.response.* import io.ktor.server.response.*
val bets = mutableListOf<Bet>() val bets = mutableListOf<Bet>()
val tokenManagerBet= AppConfig.tokenManager
fun CreateId() : Int{
return bets.size
}
fun Application.BetRouter(){ fun Application.BetRouter(){
routing{ routing{
route("/bets/add"){ route("/bets/add"){
post{ post{
val bet = call.receive<Bet>() val bet = call.receive<BetWithoutId>()
val findbet = bets.find { it.id == bet.id } val id = CreateId()
val username = tokenManagerBet.getUsernameFromToken(bet.createdBy)
val findbet = bets.find { it.id == id }
if(findbet==null){ if(findbet==null){
bets.add(bet) val betWithId = convertBetWithoutIdToBet(bet,id,username)
call.respond(HttpStatusCode.Created, bet) bets.add(betWithId)
call.respond(HttpStatusCode.Created, betWithId)
} }
call.respond(HttpStatusCode.Conflict,"Bet already exist") call.respond(HttpStatusCode.Conflict,"Bet already exist")
} }

@ -3,35 +3,34 @@ package allin.routing
import allin.dto.* import allin.dto.*
import allin.model.CheckUser import allin.model.CheckUser
import allin.model.User import allin.model.User
import allin.utils.CryptManager import allin.utils.AppConfig
import com.typesafe.config.ConfigFactory
import io.ktor.http.* import io.ktor.http.*
import io.ktor.server.application.* import io.ktor.server.application.*
import io.ktor.server.auth.* import io.ktor.server.auth.*
import io.ktor.server.auth.jwt.* import io.ktor.server.auth.jwt.*
import io.ktor.server.config.*
import io.ktor.server.request.* import io.ktor.server.request.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import allin.utils.RegexChecker
import allin.utils.TokenManager
val users = mutableListOf<User>() val users = mutableListOf<User>()
val tokenManager= TokenManager(HoconApplicationConfig(ConfigFactory.load())) val RegexCheckerUser= AppConfig.regexChecker
val RegexChecker= RegexChecker() val CryptManagerUser= AppConfig.cryptManager
val CryptManager= CryptManager() val tokenManagerUser=AppConfig.tokenManager
fun Application.UserRouter() { fun Application.UserRouter() {
routing { routing {
route("/users/register"){ route("/users/register"){
post { post {
val TempUser = call.receive<User>() val TempUser = call.receive<User>()
if (RegexChecker.isEmailInvalid(TempUser.email)){ if (RegexCheckerUser.isEmailInvalid(TempUser.email)){
call.respond(HttpStatusCode.Forbidden,"Input a valid mail !") call.respond(HttpStatusCode.Forbidden,"Input a valid mail !")
} }
val user = users.find { it.username == TempUser.username || it.email == TempUser.email } val user = users.find { it.username == TempUser.username || it.email == TempUser.email }
if(user == null) { if(user == null) {
CryptManager.passwordCrypt(TempUser) CryptManagerUser.passwordCrypt(TempUser)
TempUser.token=tokenManagerUser.generateOrReplaceJWTToken(TempUser)
users.add(TempUser) users.add(TempUser)
call.respond(HttpStatusCode.Created, TempUser) call.respond(HttpStatusCode.Created, TempUser)
} }
@ -43,8 +42,8 @@ fun Application.UserRouter() {
post { post {
val checkUser = call.receive<CheckUser>() val checkUser = call.receive<CheckUser>()
val user = users.find { it.username == checkUser.login || it.email == checkUser.login } val user = users.find { it.username == checkUser.login || it.email == checkUser.login }
if (user != null && CryptManager.passwordDecrypt(user,checkUser.password)) { if (user != null && CryptManagerUser.passwordDecrypt(user,checkUser.password)) {
user.token=tokenManager.generateOrReplaceJWTToken(user) user.token=tokenManagerUser.generateOrReplaceJWTToken(user)
call.respond(HttpStatusCode.OK, convertUserToUserDTOToken(user)) call.respond(HttpStatusCode.OK, convertUserToUserDTOToken(user))
} else { } else {
call.respond(HttpStatusCode.NotFound,"Login and/or password incorrect.") call.respond(HttpStatusCode.NotFound,"Login and/or password incorrect.")

@ -25,3 +25,5 @@ class DateSerializer : KSerializer<Date> {
encoder.encodeString(dateString) encoder.encodeString(dateString)
} }
} }
//Zoned date time

@ -0,0 +1,11 @@
package allin.utils
import com.typesafe.config.ConfigFactory
import io.ktor.server.config.HoconApplicationConfig
object AppConfig {
val config: HoconApplicationConfig = HoconApplicationConfig(ConfigFactory.load())
val tokenManager = TokenManager.getInstance(config)
val regexChecker= RegexChecker()
val cryptManager = CryptManager()
}

@ -4,15 +4,16 @@ import allin.model.User
import com.auth0.jwt.JWT import com.auth0.jwt.JWT
import com.auth0.jwt.JWTVerifier import com.auth0.jwt.JWTVerifier
import com.auth0.jwt.algorithms.Algorithm import com.auth0.jwt.algorithms.Algorithm
import com.auth0.jwt.interfaces.DecodedJWT
import io.ktor.server.config.* import io.ktor.server.config.*
import java.util.* import java.util.*
class TokenManager (val config: HoconApplicationConfig){ class TokenManager private constructor(val config: HoconApplicationConfig) {
val audience=config.property("audience").getString() val audience=config.property("audience").getString()
val secret=config.property("secret").getString() val secret=config.property("secret").getString()
val issuer=config.property("issuer").getString() val issuer=config.property("issuer").getString()
private fun generateJWTToken(user : User): String { fun generateJWTToken(user : User): String {
val expirationDate = System.currentTimeMillis() + 604800000 // une semaine en miliseconde val expirationDate = System.currentTimeMillis() + 604800000 // une semaine en miliseconde
val token = JWT.create() val token = JWT.create()
@ -40,12 +41,25 @@ class TokenManager (val config: HoconApplicationConfig){
} }
} }
private fun isTokenExpired(token: String): Boolean { fun isTokenExpired(token: String): Boolean {
val expirationTime = JWT.decode(token).expiresAt.time val expirationTime = JWT.decode(token).expiresAt.time
return System.currentTimeMillis() > expirationTime return System.currentTimeMillis() > expirationTime
} }
private fun getUserToken(user: User): String? { fun getUserToken(user: User): String? {
return user.token return user.token
} }
fun getUsernameFromToken(token: String) : String{
val decodedJWT: DecodedJWT = JWT.decode(token)
return decodedJWT.getClaim("username").asString()
}
companion object {
private var instance: TokenManager? = null
fun getInstance(config: HoconApplicationConfig): TokenManager {
return instance ?: synchronized(this) {
instance ?: TokenManager(config).also { instance = it }
}
}
}
} }
Loading…
Cancel
Save