로그인은 이전의 회원가입 과정과 매우 유사하다.
하나 다른 점은 로그인했을 때 발급받은 jwt(json WebToken)을 저장해주어야 된다는 점이 다르다.
실패, 성공 함수를 관리하기 위해 logInView interface를 만들어준다.
package com.example.dologinout
interface LogInView {
fun onLogInSuccess()
fun onLogInFailure()
}
view, api를 관리하는 authService에 login 기능을 추가한다.
private lateinit var logInView: LogInView
fun setLogInView(logInView: LogInView){
this.logInView = logInView
}
fun login(user : User)
{
val authService = getRetrofit().create(AuthRetrofitInterface::class.java)
authService.login(user).enqueue(object: Callback<AuthResponse> {
override fun onResponse(call: Call<AuthResponse>, response: Response<AuthResponse>) {
Log.d("LOGIN/SUCCESS", response.toString())
val resp:AuthResponse = response.body()!!
when(resp.code)
{
}
}
override fun onFailure(call: Call<AuthResponse>, t: Throwable) {
Log.d("LOGIN/FAILURE", t.message.toString())
}
})
}
이때 Call<>의 괄호 안에 들어가는 값은 우리가 reponse 받을 값의 데이터클래스 형태로 정의된 것이다.
회원가입 요청 시 "isSuccess", "code", "message" "result" 값을 리턴받으므로 이 형태의 데이터 클래스를 만들어준다. 위의 코드에서는 데이터 클래스의 이름을 AuthResponse로 명시했기 때문에 그대로 만들어준다.
@POST("/users/login")
fun login(@Body user: User): Call<AuthResponse>
LogInActivity에서 인터페이스인 LogInView를 상속받아 적용시켜야한다.
로그인 성공 시 받은 jwt를 저장하는 함수를 만들어준다.
jwt(json WebToken)을 저장하는 이유는 매번 로그인을 진행할 수 없기 때문에 access token을 주고 받음으로써 사용자를 식별할 수 있기 때문이다.
private fun saveJwt(jwt : String)
{
val spf = getSharedPreferences("auth", MODE_PRIVATE)
val editor = spf.edit()
editor.putString("jwt", jwt)
editor.apply()
}
로그인 성공 시 받는 response와 맞추어주어야 한다.
따라서 추가적으로 필요한 result를 선언해준다.
json으로 request를 보내줄 때에는 @SerializedName(value = "email") val email: String의 형태로 만들어주어야 한다.
package com.example.dologinout
import com.google.gson.annotations.SerializedName
data class AuthResponse(
@SerializedName(value = "isSuccess") val isSuccess:Boolean,
@SerializedName(value = "code") val code:Int,
@SerializedName(value = "message") val message:String,
@SerializedName(value = "result") val result : Result?
)
data class Result(
@SerializedName(value = "userIdx") val userIdx : Int,
@SerializedName(value = "jwt") val jwt : String
)
로그인api와 회원가입api가 authResponse라는 같은 데이터시트를 사용하기 때문에 회원가입 사용 되지 않을 result값은 ?으로 null 처리해주어야 한다.
fun onLogInSuccess(code : Int, result: Result)
code -> 1000, 2000, etc ...
result -> userId & jwt
를 사용하기 위해서 매개변수로 넣어준다.
when(val code = resp.code)
{
1000 -> logInView.onLogInSuccess(code, resp.result!!)
else -> logInView.onLogInFailure()
}
이렇게 만들어진 onLogInSuccess(), onLogInFailure()를 logInActivity에서 구현한다. (현재 우리는 MainActivity를 로그인 창으로 활용하고 있다.)
saveJwt 함수를 이용해 성공 시 jwt를 sharedPreference에 저장하도록 한다.
