La mia app

Questa è la configurazione dell'autenticazione.

package com.example

import com.example.Roots.DOMAIN
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.sessions.*

fun Application.auth(authClient: HttpClient = client) {

    install(Sessions) {

        cookie<Session>("user_session") {
            cookie.extensions["SameSite"] = "lax"
        }
    }

    //

    val redirects = mutableMapOf<String, String>()

    install(Authentication) {

        oauth("auth-oauth-auth0") {

            urlProvider = { "$DOMAIN$SILVER/callback" }

            providerLookup = {
                OAuthServerSettings.OAuth2ServerSettings(
                    name = "auth0",
                    authorizeUrl = "https://dev-zqz-kev4.eu.auth0.com/authorize?&prompt=login",
                    accessTokenUrl = "https://dev-zqz-kev4.eu.auth0.com/oauth/token",
                    requestMethod = HttpMethod.Post,
                    clientId = System.getenv("AUTH0_CLIENT_ID"),
                    clientSecret = System.getenv("AUTH0_CLIENT_SECRET"),
                    defaultScopes = listOf("openid", "profile", "email"),
                    onStateCreated = { call, state ->
                        redirects[state] = call
                            .request.queryParameters["redirectUrl"] ?: "/silver/post-login"
                    }
                )
            }

            client = authClient
        }
    }

    //

    routing {

        authenticate("auth-oauth-auth0") {

            get("/$SILVER/login") {}

            get("/$SILVER/callback") {

                val principal: OAuthAccessTokenResponse.OAuth2? = call.principal()
                call.sessions.set(Session(principal!!.accessToken))
                val redirect = redirects[principal.state!!]
                call.respondRedirect(redirect!!)
            }
        }

        get("/$SILVER/logout") {

            val url = "https://dev-zqz-kev4.eu.auth0.com/v2/logout?client_id=" +
                    System.getenv("AUTH0_CLIENT_ID")

            call.sessions.clear<Session>()
            client.get(url)

            call.respondRedirect("/$SILVER/post-logout")
        }
    }
}

Mentre questo è il modo in cui vengono raccolte le informazioni sugli utenti autenticati.

package com.example

import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class User(
    @SerialName("sub") val sub: String = "",
    @SerialName("given_name") val givenName: String = "",
    @SerialName("family_name") val familyName: String = "",
    @SerialName("nickname") val nickname: String = "",
    @SerialName("name") val name: String = "",
    @SerialName("picture") val picture: String = "",
    @SerialName("locale") val locale: String = "",
    @SerialName("updated_at") val updatedAt: String = "0000-01-01T00:00:00Z",
    @SerialName("email") val email: String = "",
    @SerialName("email_verified") val emailVerified: Boolean = false
)

object UserInfo {

    private const val URL = "https://dev-zqz-kev4.eu.auth0.com/userinfo"
    private val client = HttpClient()

    suspend fun getUserInfoFromAuth0(token: String): User {

        val response: String = client.get(URL) {
            header("Authorization", "Bearer $token")
        }.bodyAsText()

        return try {

            Json.decodeFromString(response)

        } catch (e: Exception) {

            e.printStackTrace()
            User("", "", "", "", "", "", "", "", "", false)
        }
    }
}

Per saperne di più sulla mia app, vai alla pagina successiva.