나는 응용 프로그램을 만들기 시작하고 처음에는 모의 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
기본 인증이 형식의 인증 헤더가 필요합니다 : "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())