拦截初始 Ktor 身份验证路由

Intercept initial Ktor authenticate route

我正在尝试将 ktor oauth 设置为与 GitHub oauth 一起用于 GitHub 应用程序。

我想在安装 GitHub App 后对用户进行身份验证,所以 我在 GitHub 配置中选中了 Request user authorization (OAuth) during installation 复选框。此功能将获取 Callback URL 并向其发送初始请求。问题是,它必须与 oauth 进程中的 redirect URL 相同(ktor auth 配置中的 urlProvider)。

我的授权配置:

install(Authentication) {
    oauth("auth-oauth-github") {
        urlProvider = { "$ngrokUrl/gh/oauth/callback" }
        providerLookup = {
            OAuthServerSettings.OAuth2ServerSettings(
                name = "github",
                authorizeUrl = "https://github.com/login/oauth/authorize",
                accessTokenUrl = "https://github.com/login/oauth/access_token",
                requestMethod = HttpMethod.Post,
                clientId = System.getenv("GITHUB_CLIENT_ID"),
                clientSecret = System.getenv("GITHUB_CLIENT_SECRET"),
                passParamsInURL = true,
                defaultScopes = listOf("user:email"),
            )
        }
        client = httpClient
    }
}
routing {
    authenticate("auth-oauth-github") {
        get("/gh/oauth/callback") {
            // need to check some parameters for initial request
            // and later for the second request need to retrieve principal
        }
    }
}

我遇到的问题是我必须分析来自 GitHub 的初始请求的参数,但 ktor auth 会自动重定向到 authorizeUrl.

我的问题是:

遗憾的是,无法使用 OAuthAuthenticationProvider 禁用到 authorizeUrl 的重定向。您可以为 authenticate 路由添加一个拦截器,以便在身份验证(重定向)发生之前注入您的代码。

authenticate("auth-oauth-github") {
    val phase = PipelinePhase("MyPhase")
    insertPhaseBefore(Authentication.AuthenticatePhase, phase)
    intercept(phase) {
        // Do your processing here
        // call.request contains data for the initial request
    }

    // ...
}