У меня есть приложение для Android, которое необходимо подключить к веб-сервису.В настоящее время я пытаюсь реализовать логин.У меня есть client_id, client_secret, grant_type, password, scope и username, но мне нужно получить access_token.
Я уже пытался реализовать этот ответ и решение в этом вопросе
В своем коде ниже я также попытался переключить метод requestMethod на "POST", и прокомментированные части являются альтернативами, которые я тоже пробовал.
import android.app.Activity
import android.util.Base64
import android.util.Log
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.net.HttpURLConnection
import java.net.URL
object ServerConnection {
private const val TAG = "ServerConnection"
var token: String? = null
private set
fun login(username: String, password: String, baseUrl: String, clientId: String, clientSecret: String, grantType: String, scope: String): Boolean {
//val payload = """{username: "$username", password: "$password", grant_type: "$grantType", client_id: "$clientId", scope: "$scope", client_secret: "$clientSecret"}"""
//val payload = """grant_type=$grantType&username=$username&password=$password&scope=$scope"""
val payload = """client_id=$clientId&client_secret=$clientSecret&grant_type=$grantType&username=$username&password=$password&scope=$scope"""
//val authorization = "Basic " + Base64.encodeToString(("$clientId:$clientSecret").toByteArray(), Base64.NO_WRAP)
return login("$baseUrl/oauth/token", payload/*, authorization*/)
}
private fun login(url: String, payload: String/*, authorization: String*/): Boolean {
val urlObject = URL(url)
val connection = urlObject.openConnection() as HttpURLConnection
connection.doOutput = true
connection.requestMethod = "GET"
connection.setRequestProperty("Accept", "application/json")
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8")
//connection.setRequestProperty("Authorization", authorization)
//connection.setRequestProperty("Content-Type", "application/json;odata=verbose")
//connection.setRequestProperty("Authorization", "Basic Base64_encoded_clientId:clientSecret")
//connection.setRequestProperty("Accept", "application/x-www-form-urlencoded")
val outputStream = connection.outputStream
outputStream.write(payload.toByteArray())
outputStream.flush()
outputStream.close()
val responseCode = connection.responseCode
Log.i(TAG, "GET Response Code :: $responseCode")
if (responseCode == HttpURLConnection.HTTP_OK) { //success
val bufferedReader = BufferedReader(InputStreamReader(connection.inputStream))
var inputLine: String
val response = StringBuffer()
do {
inputLine = bufferedReader.readLine()
if (inputLine == null) break
response.append(inputLine)
} while (true)
bufferedReader.close()
// log result
Log.d(TAG, response.toString())
token = response.toString()
} else {
Log.i(TAG, "GET request not worked")
return false
}
return true
}
}
Я былЯ не уверен, что строка, которую я получу из StringBuffer response
, действительно будет токеном, но я ожидал, по крайней мере, достичь ее.
На самом деле она даже не доходит, потому что responseCode
всегда 400
.