Stefan Oltmann
10/26/2021, 10:13 AMAleksei Tirman [JB]
10/26/2021, 1:18 PMimport io.ktor.client.*
import io.ktor.client.engine.apache.*
import io.ktor.client.features.json.*
import io.ktor.client.features.json.serializer.*
import io.ktor.client.request.*
import io.ktor.http.*
import kotlinx.serialization.Serializable
suspend fun main(args: Array<String>) {
val client = HttpClient(Apache) {
install(JsonFeature) {
serializer = KotlinxSerializer(kotlinx.serialization.json.Json {
ignoreUnknownKeys = true
})
}
}
val accessToken = "sl.A7G7Mw5SveSZQ7j9OX1HFRv3d-VkP3IPoqfhEzfJz-yNSKOdDiQa-eVQ53TVCHr_KXKh5Iwc6OFHQttOJ_y0pxX8DctT9E0tJ_eLetLQHzpxUoFaNXESjDwfvt7mvCIOtzoC2RU"
val result = <http://client.post|client.post><AccountResponse>("<https://api.dropboxapi.com/2/users/get_current_account>") {
header(HttpHeaders.Authorization, "Bearer $accessToken")
}
println(result.name.display_name)
}
@Serializable
data class AccountResponse(val account_id: String, val name: AccountName)
@Serializable
data class AccountName(val display_name: String)
Could you please share the code for Bearer authentication?Stefan Oltmann
10/26/2021, 1:21 PMfun createClient(
oAuthConfig: OAuthConfig,
loadTokenPair: () -> OAuthTokenPair,
saveNewTokenPair: (OAuthTokenPair) -> Unit
): HttpClient {
return HttpClient(CIO) {
install(Auth) {
expectSuccess = false
install(JsonFeature) {
serializer = KotlinxSerializer()
}
bearer {
loadTokens {
val tokenPair = loadTokenPair()
BearerTokens(
accessToken = tokenPair.accessToken,
refreshToken = tokenPair.refreshToken!!
)
}
refreshTokens {
val tokenPair = loadTokenPair()
val newTokenPair = refreshTokenPair(
oAuthConfig = oAuthConfig,
refreshToken = tokenPair.refreshToken!!
)
val toSavePair = OAuthTokenPair(
accessToken = newTokenPair.accessToken,
refreshToken = tokenPair.refreshToken
)
saveNewTokenPair(toSavePair)
BearerTokens(
accessToken = toSavePair.accessToken,
refreshToken = toSavePair.refreshToken!!
)
}
}
}
}
}
I don't understand why this code in contrast works:
private suspend fun refreshTokenPair(
tokenUrl: String,
refreshToken: String,
clientId: String,
clientSecret: String?,
redirectUri: String?
): OAuthTokenPair {
val tokenClient = HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer(
Json {
ignoreUnknownKeys = true
}
)
}
}
return tokenClient.submitForm(
url = tokenUrl,
formParameters = Parameters.build {
append("grant_type", "refresh_token")
append("refresh_token", refreshToken)
append("client_id", clientId)
// redirectUri?.let { redirectUri -> append("redirect_uri", redirectUri) }
clientSecret?.let { clientSecret -> append("client_secret", clientSecret) }
}
)
}
Stefan Oltmann
10/26/2021, 1:23 PMStefan Oltmann
10/26/2021, 1:30 PMsuspend fun getDisplayName() {
val client = HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer(kotlinx.serialization.json.Json {
ignoreUnknownKeys = true
})
}
}
val accessToken = "mytoken"
val result = <http://client.post|client.post><AccountResponse>("<https://api.dropboxapi.com/2/users/get_current_account>") {
header(HttpHeaders.Authorization, "Bearer $accessToken")
}
println(result.name.display_name)
}
@Serializable
data class AccountResponse(val account_id: String, val name: AccountName)
@Serializable
data class AccountName(val display_name: String)
Stefan Oltmann
10/26/2021, 1:34 PMinstall(JsonFeature) {
serializer = KotlinxSerializer()
}
must be on the same level as install(Auth)
, not inside.Stefan Oltmann
10/26/2021, 1:36 PMAleksei Tirman [JB]
10/26/2021, 1:41 PMStefan Oltmann
10/26/2021, 1:41 PM