diff --git a/src/main/kotlin/application/Application.kt b/src/main/kotlin/application/Application.kt index c2b6cd9..3c3050f 100644 --- a/src/main/kotlin/application/Application.kt +++ b/src/main/kotlin/application/Application.kt @@ -18,7 +18,7 @@ import fr.dcproject.component.auth.UserRepository import fr.dcproject.component.auth.jwt.JwtConfig import fr.dcproject.component.auth.routes.authLogin import fr.dcproject.component.auth.routes.authRegister -import fr.dcproject.component.auth.routes.authSso +import fr.dcproject.component.auth.routes.authPasswordless import fr.dcproject.component.auth.user import fr.dcproject.component.citizen.routes.changeMyPassword import fr.dcproject.component.citizen.routes.findCitizen @@ -196,7 +196,7 @@ fun Application.module(env: Env = PROD) { /* Auth */ authLogin(get()) authRegister(get()) - authSso(get()) + authPasswordless(get()) /* Workgroup */ getWorkgroups(get(), get()) getWorkgroup(get(), get()) diff --git a/src/main/kotlin/application/KoinModule.kt b/src/main/kotlin/application/KoinModule.kt index 603b9a2..2072372 100644 --- a/src/main/kotlin/application/KoinModule.kt +++ b/src/main/kotlin/application/KoinModule.kt @@ -11,7 +11,7 @@ import com.rabbitmq.client.ConnectionFactory import fr.dcproject.component.article.ArticleRepository import fr.dcproject.component.article.ArticleViewManager import fr.dcproject.component.article.ArticleVoter -import fr.dcproject.component.auth.SsoManager +import fr.dcproject.component.auth.PasswordlessAuth import fr.dcproject.component.auth.UserRepository import fr.dcproject.component.citizen.CitizenRepository import fr.dcproject.component.citizen.CitizenVoter @@ -136,8 +136,8 @@ val KoinModule = module { // Mailer single { Mailer(Configuration.sendGridKey) } - // SSO Manager for connection - single { SsoManager(get(), Configuration.domain, get()) } + // Used to send a connexion link by email + single { PasswordlessAuth(get(), Configuration.domain, get()) } single { Publisher(get(), get()) } diff --git a/src/main/kotlin/component/auth/SsoManager.kt b/src/main/kotlin/component/auth/PasswordlessAuth.kt similarity index 93% rename from src/main/kotlin/component/auth/SsoManager.kt rename to src/main/kotlin/component/auth/PasswordlessAuth.kt index 331da58..6148bff 100644 --- a/src/main/kotlin/component/auth/SsoManager.kt +++ b/src/main/kotlin/component/auth/PasswordlessAuth.kt @@ -11,9 +11,9 @@ import fr.dcproject.messages.Mailer import io.ktor.http.* /** - * Send an email to the citizen with a link to automatically connect + * Send a connexion link by email */ -class SsoManager( +class PasswordlessAuth( private val mailer: Mailer, private val domain: String, private val citizenRepo: CitizenRepository @@ -27,7 +27,7 @@ class SsoManager( mailer.sendEmail { val token = citizen.user.makeToken() Mail( - Email("sso@$domain"), + Email("passwordless-auth@$domain"), "Connection", Email(citizen.email), Content("text/plain", generateContent(token, url)) diff --git a/src/main/kotlin/component/auth/routes/Sso.kt b/src/main/kotlin/component/auth/routes/Sso.kt index d2676b5..6469ac0 100644 --- a/src/main/kotlin/component/auth/routes/Sso.kt +++ b/src/main/kotlin/component/auth/routes/Sso.kt @@ -1,7 +1,7 @@ package fr.dcproject.component.auth.routes -import fr.dcproject.component.auth.SsoManager -import fr.dcproject.component.auth.routes.SsoRequest.Input +import fr.dcproject.component.auth.PasswordlessAuth +import fr.dcproject.component.auth.routes.PasswordlessRequest.Input import io.ktor.application.* import io.ktor.http.* import io.ktor.locations.* @@ -11,8 +11,8 @@ import io.ktor.routing.* import io.ktor.util.* @KtorExperimentalLocationsAPI -@Location("/sso") -class SsoRequest { +@Location("/auth/passwordless") +class PasswordlessRequest { data class Input(val email: String, val url: String) } @@ -21,12 +21,12 @@ class SsoRequest { */ @KtorExperimentalLocationsAPI @KtorExperimentalAPI -fun Route.authSso(ssoManager: SsoManager) { - post { +fun Route.authPasswordless(passwordlessAuth: PasswordlessAuth) { + post { call.receive().run { try { - ssoManager.sendEmail(email, url) - } catch (e: SsoManager.EmailNotFound) { + passwordlessAuth.sendEmail(email, url) + } catch (e: PasswordlessAuth.EmailNotFound) { call.respond(HttpStatusCode.NotFound) } call.respond(HttpStatusCode.NoContent) diff --git a/src/main/resources/openapi.yaml b/src/main/resources/openapi.yaml index 03e9d2c..218c577 100644 --- a/src/main/resources/openapi.yaml +++ b/src/main/resources/openapi.yaml @@ -37,12 +37,16 @@ paths: text/plain: example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJBdXRoZW50aWNhdGlvbiIsImlzcyI6ImRjLXByb2plY3QuZnIiLCJpZCI6ImQ1NDRhNmE4LWJhYjgtNDU2MC05NWIxLThhZjAyMDNkOTEwNCIsImV4cCI6MTU2NzA3Mzc0Mn0.0VTetv8fZFjVgpJ-bwJpidGNHJUOmgj8vuZcZXzwnLa7TtFwcXWvh3bDPYHqB66nmOfXyM57XnHDbmRwtipCag - /sso: + /auth/passwordless: post: - summary: Send email with JWT + summary: Send a connexion link by email + description: Send a connexion link by email with the token required to the connexion + externalDocs: + description: Explanation of Passwordless auth + url: https://en.wikipedia.org/wiki/Passwordless_authentication tags: - authentification - operationId: sso + operationId: passwordless requestBody: content: application/json: @@ -58,7 +62,7 @@ paths: type: string description: url tu redirect with the token example: - http://dc-project.fr/sso + http://dc-project.fr/auth/passwordless responses: 204: diff --git a/src/test/kotlin/functional/MailerTest.kt b/src/test/kotlin/functional/MailerTest.kt index cb70308..8ee5c8b 100644 --- a/src/test/kotlin/functional/MailerTest.kt +++ b/src/test/kotlin/functional/MailerTest.kt @@ -28,7 +28,7 @@ class MailerTest : KoinTest, AutoCloseKoinTest() { withTestApplication({ module(TEST) }) { get().sendEmail { Mail( - Email("sso@dc-project.fr"), + Email("passwordless-auth@dc-project.fr"), "Test", Email("fabrice.lecomte.be@gmail.com"), Content("text/plain", "Email Work !") diff --git a/src/test/resources/feature/citizen.feature b/src/test/resources/feature/citizen.feature index 93572d9..b75a82c 100644 --- a/src/test/resources/feature/citizen.feature +++ b/src/test/resources/feature/citizen.feature @@ -24,13 +24,13 @@ Feature: citizens routes | id | 47356809-c8ef-4649-8b99-1c5cb9886d38 | @online - Scenario: Can be connect with SSO + Scenario: Can be connect with Passwordless auth Given I have citizen | id | c606110c-ff0e-4d09-a79e-74632d7bf7bd | | email | fabrice.lecomte.be@gmail.com | | firstName | Leonhard | | lastName | Euler | - When I send a POST request to "/sso" with body: + When I send a POST request to "/auth/passwordless" with body: """ { "url": "https://dc-project.fr/password/reset",