es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La actualización del token de portador multipropósito de Ktor lleva a “intento de mutación del objeto frozen kotlin.native.internal.Ref”.

Estoy intentando que el cliente de Ktor actualice un token Bearer en un proyecto Kotlin Multiplatform.

Aquí hay un ejemplo de cómo se supone que debe funcionar.

Mi código para la configuración del cliente http es bastante similar, excepto por las diferentes solicitudes para obtener y actualizar un token:

install(Auth) {
lateinit var tokenInfo: TokenInfo
var refreshTokenInfo: TokenInfo

bearer {
    loadTokens {
        val url = "https://${environment.host}:${environment.port}/oauth/login"
        tokenInfo = tokenClient.post<tokeninfo>(url) {
            contentType(ContentType.Application.Json)
            body = buildJsonObject {
                put("username", "blah")
                put("password", "blub")
            }
        }
        BearerTokens(
            accessToken = tokenInfo.data.access_token,
            refreshToken = tokenInfo.data.refresh_token
        )
    }
    refreshTokens {
        val url = "https://${environment.host}:${environment.port}/oauth/refresh"
        refreshTokenInfo = tokenClient.get<tokeninfo>(url) {
            contentType(ContentType.Application.Json)
            header(HttpHeaders.Authorization, tokenInfo.data.refresh_token)
        }
        BearerTokens(
            accessToken = refreshTokenInfo.data.access_token,
            refreshToken = refreshTokenInfo.data.access_token
        )
    }
}

}

Pero esto provoca “mutation attempt of frozen kotlin.native.internal.Ref”.
Parece que no le gusta “lateinit var tokenInfo: TokenInfo”.

Esto solo sucede en iOS. En Android funciona.

(Por cierto, cambié al nuevo modelo de memoria. Pero en este caso no parece importar, es el mismo error.)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para actualizar el token de acceso en un proyecto multiplataforma de Kotlin usando el cliente Ktor

    Para actualizar el token de acceso en un proyecto multiplataforma de Kotlin usando el cliente Ktor, es necesario configurar el cliente HTTP instalando Auth. Sin embargo, hay un problema con lateinit var tokenInfo: TokenInfo, lo cual provoca un error mutation attempt of frozen kotlin.native.internal.Ref en iOS, a diferencia de Android donde funciona correctamente.

    Para solucionar este problema, debes modificar el código para evitar el uso de lateinit var y en su lugar usar tipos Nullable para TokenInfo y refreshTokenInfo. Esto te permitirá asignar valores nulos a las variables antes de inicializarlas con los valores reales de las respuestas de las solicitudes. Aquí tienes cómo se debe actualizar el código:

    ...
    install(Auth) {
        var tokenInfo: TokenInfo? = null
        var refreshTokenInfo: TokenInfo? = null
    
        bearer {
            loadTokens {
                val url = "https://${environment.host}:${environment.port}/oauth/login"
                tokenInfo = tokenClient.post<tokeninfo>(url) {
                    contentType(ContentType.Application.Json)
                    body = buildJsonObject {
                        put("username", "blah")
                        put("password", "blub")
                    }
                }
                BearerTokens(
                    accessToken = tokenInfo!!.data.access_token,
                    refreshToken = tokenInfo!!.data.refresh_token
                )
            }
            refreshTokens {
                val url = "https://${environment.host}:${environment.port}/oauth/refresh"
                refreshTokenInfo = tokenClient.get<tokeninfo>(url) {
                    contentType(ContentType.Application.Json)
                    header(HttpHeaders.Authorization, tokenInfo!!.data.refresh_token)
                }
                BearerTokens(
                    accessToken = refreshTokenInfo!!.data.access_token,
                    refreshToken = refreshTokenInfo!!.data.access_token
                )
            }
        }
    }
    

    Ten en cuenta que hemos agregado ? a la declaración de tipo para tokenInfo y refreshTokenInfo. Además, hemos utilizado el operador !! para indicar que esperamos que estas variables no sean nulas cuando accedemos a sus miembros, como data.access_token. Esto se debe a que sabemos que inicializaremos estas variables antes de intentar usarlas, aunque el compilador no pueda estar seguro.

    Con estas modificaciones, deberías poder actualizar el token de acceso utilizando el cliente Ktor y evitar el error mutation attempt of frozen kotlin.native.internal.Ref en iOS.

Comments are closed.