Почему токен доступа из моего кода Kotlin не работает?

#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 в теле запроса.

Надеюсь, у вас все хорошо с вашим замечательным приложением!