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.