안드로이드 | 기본 인증 retrofit2 지역 API를 사용하여

ZookKep :

나는 응용 프로그램을 만들기 시작하고 처음에는 모의 API에 연결되어 있습니다. 지금은 내 PC에서 실행되는 API를 연결합니다.

우선, 나는 로그인 액세스를 구현하기 위해 노력하고있어. 내 API의 기본 URL은 이후 에 http : // localhost를 : 5000 / 에너지 / API는 / 내가 HTTP로 변경 : // << MyIPAddress >> : 5000 / 에너지 / API / (이 잘 아직 알고하지 않습니다). 내 실제 전화에서 테스트하고 있습니다. 나는 기본 인증으로 로그인하고 싶습니다 동안하지만 내 코드의 사용자 이름과 암호 (이것은 내가 우체부에서 그것을 할 방법입니다), 매개 변수로 전달됩니다. 내가 인증을 수행 할 수하는 방법을 예를 들어이있다 : 여기에 이미지 설명을 입력

하지만 내 코드에 난이 얻을 : 여기에 이미지 설명을 입력

이것은 나의 요청 관리자입니다 :

object RequestManager {
    val interceptor = HttpLoggingInterceptor()
    val client = OkHttpClient.Builder().addInterceptor(interceptor).build()
    init {
        interceptor.level = HttpLoggingInterceptor.Level.BODY
    }

    val retrofit = Retrofit.Builder()
        .baseUrl("http://<<MYIP>>:5000/energy/api/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()

    val service = retrofit.create(Api::class.java)

내 MainActivity.kt :

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        login_button.setOnClickListener {
            buttonClicked()
        }

        if (getTokenFromPrefs()?.length!! > 0) {
            openSearchActivity()
        }
    }

    private fun buttonClicked() {
        val username = username_edittext.text.toString()
        val password = password_edittext.text.toString()
        Log.d("eeee","button clicked " + username_edittext.text.toString() + " password "+password_edittext.text.toString() )

        val call = RequestManager.service.login(username, password)
        call.enqueue(object : Callback<LoginResponse> {
            override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                if (response.isSuccessful ){
                        openSearchActivity()
                        saveTokenToPrefs(response.toString())
                    }else {

                }
            }

            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
            }
        })
    }

    val TOKENPREFSKEY = "tokenprefskey"
    private fun saveTokenToPrefs(token: String) {
        val pref = applicationContext.getSharedPreferences("CGEEnergy", 0)
        val editor = pref.edit()
        editor.putString(TOKENPREFSKEY, token)
        editor.commit()
    }

    private fun getTokenFromPrefs(): String? {
        val pref = applicationContext.getSharedPreferences("CGEEnergy", 0)
        return pref.getString(TOKENPREFSKEY, "")
    }

    private fun openSearchActivity() {
        val intent = Intent(this, SearchActivity::class.java)
        startActivity(intent)
        if (getTokenFromPrefs()?.length!! == 0) {
            openMainActivity()
        }
        finish()
    }
    private fun openMainActivity() {
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
        finish()
    }
}

내 API.kt 코드 : (편집 사용자가 시정 안녕하세요 )

interface Api {
    @POST("Login")
    @FormUrlEncoded
    fun login(@Field("username") username: String, @Field("password") password: String): Call<LoginResponse>
}

내 LoginResponse.java 코드 :

public class LoginResponse {

    @SerializedName("token")
    @Expose
    private String token;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

}

수있는 사람의 도움 나 기본 인증과 함께? 또한 내 기본 URL에 문제가 있습니까? (대신 로컬 호스트의 IP 첨가). 모든 팁은 매우 감사하겠습니다.

추신. 는 HTTP 보안 문제에 대한, 난 이미 추가 한

android:usesCleartextTraffic="true"

내에서 의 AndroidManifest.xml

P 목수 :

기본 인증이 형식의 인증 헤더가 필요합니다 : "Basic " + Base64.encode(<username>:<password>)

이처럼 API 인터페이스를 변경해야

interface Api {
    @POST("Login")
    fun login(@Header("Authorization") authorization: String): Call<LoginResponse>
}

이제 당신과 같이 전화로 인증 헤더를 추가 할 수 있습니다 :

val authPayload = "$userId:$password"
val data = authPayload.toByteArray()
val base64 = Base64.encodeToString(data, Base64.NO_WRAP)

val call = RequestManager.service.login("Basic $base64".trim())

추천

출처http://10.200.1.11:23101/article/api/json?id=7908&siteId=1