#android #kotlin #keycloak #httpurlconnection #access-token
#Android #kotlin #keycloak #httpurlconnection #access-token
Вопрос:
В настоящее время я занимаюсь проверкой подлинности с помощью ключа. Токен, который я получаю из своего java-кода, считается недействительным моим сервером, но если я использую postman с (почти) тем же URL-адресом и теми же значениями urlencoded, токен доступа, который я копирую из postman в область $ token моего кода, правильно аутентифицируется.
Я не могу понять, почему это может происходить, если только это не связано с URL-адресом локального хоста Android («10.0.2.2»), который портит токен.
Вот мой код для получения токена доступа
suspend fun login(username:String, password:String):String {
val httpEndpoint = "http://10.0.2.2:8180/auth/realms/MYREALM/protocol/openid-connect/token"
val myURL = URL(httpEndpoint)
val myConnection2 = myURL.openConnection() as HttpURLConnection
myConnection2.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
myConnection2.requestMethod = "POST"
myConnection2.doOutput = true
val urlParamaters = "client_id=MYCLIENTamp;username=MYUSERamp;password=MYPASSWORDamp;grant_type=password"
val os: OutputStream = myConnection2.getOutputStream()
val osw = OutputStreamWriter(os, "UTF-8")
osw.write(urlParamaters)
osw.flush()
osw.close()
println(myConnection2.responseCode)
val inputAsString = myConnection2.inputStream.bufferedReader().use { it.readText() }
val jsonObj = JSONObject(inputAsString)
val accessToken = jsonObj.getString("access_token")
println(inputAsString)
println(accessToken)
return accessToken
}
Вот мой код, использующий токен доступа.
suspend fun catPost(token:String) {
val httpEndpoint = URL("http://10.0.2.2:8080/users/cat")
val myConnection2 = httpEndpoint.openConnection() as HttpURLConnection
myConnection2.setRequestProperty("Authorization", "Bearer $token")
myConnection2.requestMethod = "GET"
println(myConnection2.responseCode)
println(myConnection2.responseMessage)
val inputAsString = myConnection2.inputStream.bufferedReader().use { it.readText() }
}
И URL-адрес postman для получения токена:
http://localhost:8180/auth/realms/MYREALM/protocol/openid-connect/token
Комментарии:
1. Этот код не является Java. Это Kotlin?
2. Пожалуйста, используйте правильные теги в своем вопросе
3. Просто изменил его, это Kotlin
Ответ №1:
Я только что решил ту же проблему.
Пожалуйста, отладьте токен, который вы получили в приложении. Попробуйте закодировать токен здесь, https://jwt.io /.
Вы можете увидеть, что декодированный токен неполон (поврежден). С этим указанием я предполагаю, что вы забыли поместить
returnSecureToken = true
в теле запроса.
Надеюсь, у вас все хорошо с вашим замечательным приложением!