Как мне войти в систему с помощью обычной аутентификации в Kotlin с помощью API GETquet? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь сделать экран входа в систему, который я создал в Android Studio, для работы с Kotlin, но у меня возникают проблемы при создании класса, который будет "прикреплять" базовую аутентификацию ко всем запросам.Для этого я использую Retrofit2 и OkHttp3.

Это соответствующие классы в моем коде:

GET_LOGIN.kt

package com.joaomartins.srodkitrwale

import okhttp3.OkHttpClient
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Headers

interface GET_LOGIN {
    @GET("login")
    fun getAccessToken() : Call<String>
}

RetrofitClient.kt

package com.joaomartins.srodkitrwale

import android.app.Application
import android.util.Base64
import kotlinx.android.synthetic.main.activity_login.*
import okhttp3.Interceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor

    val username = Login().userTxt.text
    val password = Login().passTxt.text
    val credentials = username + ":" + password
    val AUTH = "Basic " + Base64.encodeToString(credentials.toByteArray(Charsets.UTF_8), Base64.DEFAULT).replace("\n", "")

    val retrofit = RetrofitClient().init()
            //.getBytes(), Base64.DEFAULT).replace("\n", "")
//val AUTH2 = java.util.Base64.getEncoder().encode((username + ":" + password).toByteArray()).toString(Charsets.UTF_8)

class RetrofitClient {
    // Initializing Retrofit
    fun init() : Retrofit{

        // Creating the instance of an Interceptor
        val logging = HttpLoggingInterceptor()
        logging.level = HttpLoggingInterceptor.Level.BODY


        // Creating the OkHttp Builder
        val client = OkHttpClient().newBuilder()


        // Creating the custom Interceptor with Headers
        val interceptor = Interceptor { chain ->
            val request = chain?.request()?.newBuilder()?.addHeader("Authorization", AUTH)?.build()
            chain?.proceed(request)
        }
        client.addInterceptor(interceptor) // Attaching the Interceptor

        // Creating the instance of a Builder
        return Retrofit.Builder()
                .baseUrl("https://srodki.herokuapp.com/")   // The API server
                .client(client.build())                                     // Adding Http Client
                .addConverterFactory(GsonConverterFactory.create()) // Object Converter
                .build()
    }

    fun providesGetLogin(): GET_LOGIN = retrofit.create(GET_LOGIN::class.java)
}

Login.kt

package com.joaomartins.srodkitrwale

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.util.Base64
import android.util.Log
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_login.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit

class Login : AppCompatActivity() {

    val apiLogin = RetrofitClient().providesGetLogin().getAccessToken()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        loginBtn.setOnClickListener {
            val user = userTxt.text
            val pass = passTxt.text

            if (validateLogin(user, pass)){
                login(user, pass)
            }
        }
    }

    fun validateLogin(user: Editable, pass: Editable): Boolean {
        if (user == null || user.trim().isEmpty()){
            Toast.makeText(this, "Missing Username or Password", Toast.LENGTH_SHORT).show()
            return false
        }
        if (pass == null || pass.trim().isEmpty()){
            Toast.makeText(this, "Missing Username or Password", Toast.LENGTH_SHORT).show()
            return false
        }
        return true
    }

    fun login(user: Editable, pass: Editable) {
        /*val intent = Intent(this, List_users::class.java)
        startActivity(intent)*/
        apiLogin.enqueue(object : Callback<String> {
            override fun onResponse(call: Call<String>, response: Response<String>) {
                Log.d("check", "Reached this place")
                if(!response.isSuccessful)
                    Log.d("failed", "No Success")
                Toast.makeText(this@Login, "Login Successful!", Toast.LENGTH_SHORT).show()
                val intent = Intent(this@Login, List_users::class.java)
                startActivity(intent)
            }

            override fun onFailure(call: Call<String>, t: Throwable) {
                Toast.makeText(this@Login, "Login Failed.", Toast.LENGTH_SHORT).show()
            }
        })

    }

}

Класс, который будет отвечать за создание запроса с зашифрованнымаутентификация - это класс RetrofitClient .

Я полагаю, что ошибка заключается в следующих строках кода:

val username = Login().userTxt.text
val password = Login().passTxt.text
val credentials = username + ":" + password
val AUTH = "Basic " + Base64.encodeToString(credentials.toByteArray(Charsets.UTF_8), Base64.DEFAULT).replace("\n", "")

Должен быть более простой способ сделать это, но яЯ все еще изучаю Android и Kotlin.

1 Ответ

0 голосов
/ 31 декабря 2018

Если вы хотите выполнить базовую аутентификацию с помощью дооснащения, вы должны добавить перехватчик.Вы можете найти простую реализацию ниже:

Создать модифицированный клиент

val okHttpClient = OkHttpClient().newBuilder()
    .addInterceptor(AuthenticationInterceptor(BuildConfig.API_USERNAME, BuildConfig.API_PASSWORD))
    .build()

val retrofit = Retrofit.Builder()
    .client(okHttpClient)
    .baseUrl(BuildConfig.API_URL)
    .build()

Образец перехватчика

class AuthenticationInterceptor(user: String, password: String) : Interceptor {

    private val credentials: String = Credentials.basic(user, password)

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val authenticatedRequest = request.newBuilder()
            .header("Authorization", credentials).build()
        return chain.proceed(authenticatedRequest)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...