Как правильно запросить oauth-токен на андроиде? - PullRequest
0 голосов
/ 21 января 2019

У меня есть приложение для 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.

...