Token authentication adalah metode otentikasi yang menggunakan token sebagai bukti identitas pengguna dalam mengakses suatu sistem atau aplikasi. Token ini adalah string unik yang biasanya dihasilkan setelah pengguna berhasil login. Kita akan meneruskan project sebelumnya bisa diliat , lalu diberikan kepada pengguna untuk digunakan sebagai "kunci" akses. . Untuk menggunakan authentication pada android jetpack compose ada beberapa depedency yang digunakan seperti Okhttp. berikut langkah-langkah pembuatannya :
- Tambahkan depedency pada build.grandle.kt seperti dibawah ini :
// Retrofit untuk HTTP client
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.9.3")// Untuk MVVM
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5")
- Selanjutnya, buat file baru berinama Auth.kt. file tersebut merupakan data class untuk request dan respondse.
seperti dibawah ini :
data class AuthRequest(
val email: String,
val password: String
)
data class AuthResponse(
@SerializedName("message" ) var message : String? = null,
@SerializedName("result" ) var result : Result? = Result(),
@SerializedName("status" ) var status : String? = null
)
data class Result(
@SerializedName("access_token" ) var accessToken : String? = null
)
- Selanjutnya, buat file baru beri nama ApiService.kt. Dimana file tersebut menyimpan semua endpoint yang kita punya. seperti dibawah ini :
import com.example.pito.data.auth.AuthRequest
import com.example.pito.data.auth.AuthResponse
import com.example.pito.data.user.UserResponse
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
interface ApiService {
@POST("auth-account")
suspend fun login(@Body request: AuthRequest) : AuthResponse
@GET("user")
suspend fun profile() : UserResponse
}
- Selanjutnya, buat file baru berinama AuthVM.kt. Dimana file class akan berinteraksi dengan UI. seperti berikut:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.pito.data.ApiRepository
import com.example.pito.data.token.Token
import com.example.pito.data.token.TokenViewModel
import kotlinx.coroutines.launch
class AuthVM : ViewModel() {
private val repository = ApiRepository()
var loginState = mutableStateOf("")
private set
var isLoading = mutableStateOf(false)
private set
var _email by mutableStateOf("")
fun onChangeEmail(email: String){
_email = email
}
var _password by mutableStateOf("")
fun onChangePassword(password: String){
_password = password
}
init {
}
fun login(){
viewModelScope.launch {
isLoading.value = true
try {
val response = repository.login(email = _email, password = _password)
println(response.result?.accessToken.toString())
loginState.value = response.message.toString()
TokenViewModel().addToken(Token(
token = response.result?.accessToken.toString()
))
// Simpan Token Disini
}catch (e : Exception){
loginState.value = "Pastikan email dan password anda sudah benar"
}finally {
isLoading.value = false
}
}
}
- Sekarang, kita membuat agar bisa token yang telah didapatkan setelah login dapat tersimpan didatabase. buat file baru berinama Token.kt. seperti dibawah ini :
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "token")
data class Token(
@PrimaryKey(autoGenerate = true)
val id : Long = 0L,
val token : String
)
- Selanjutnya kita membuat TokenDao. Buat file baru TokenDao.kt. seperti berikut :
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import kotlinx.coroutines.flow.Flow
@Dao
abstract class TokenDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
abstract suspend fun addToken(token: Token)
@Query("select \* from token")
abstract fun getAllToken() : Flow<List<Token>>
@Query("delete from token")
abstract suspend fun deleteAllToken()
@Query("select \* from token where 1 limit 1")
abstract fun getSingleToken() : Flow<Token>
}
- Selanjutnya, membuat file AuthRepository.kt. seperti dibawah ini :
import kotlinx.coroutines.flow.Flow
class TokenRepository (private val tokenDao: TokenDao){
suspend fun addToken(token: Token){
tokenDao.addToken(token)
}
fun getAllToken() : Flow<List<Token>>{
println("Repository")
return tokenDao.getAllToken()
}
fun getSingleToken() : Flow<Token>{
return tokenDao.getSingleToken()
}
}
- Selanjutnya, buat view model untuk Token, buat file baru berinama AuthViewModel.kt. Seperti dibawah ini :import androidx.lifecycle.ViewModel
import com.example.pito.data.Graph
import kotlinx.coroutines.flow.Flow
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.count
import kotlinx.coroutines.launch
class TokenViewModel(
private val tokenRepository: TokenRepository = Graph.tokenRepository
): ViewModel() {
lateinit var getAllToken : Flow<List<Token>>
init {
// viewModelScope.launch {
// getAllToken = tokenRepository.getAllToken()
// }
}
fun getSingleToken() : Flow<Token> = tokenRepository.getSingleToken()
fun addToken(token: Token){
viewModelScope.launch {
tokenRepository.addToken(token)
} } }
- Setelah itu, kita buatkan AuthReceptor. berfungsi untuk mengirimkan token authoritation.
import okhttp3.Interceptor
import okhttp3.Response
class AuthReceptor(private val token:String) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request().newBuilder()
.addHeader("Authorization","Bearer $token")
.build()
return chain.proceed(request)
}
}
- Terakhir kita akan mengubah file ApiRepositori.kt. kita membuat instance untuk menghandle token. seperti berikut :
import com.example.pito.data.auth.AuthRequest
import com.example.pito.data.auth.AuthResponse
import com.example.pito.data.user.UserResponse
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class ApiRepository {
private var apiSerivce : ApiService
private val baseUrl:String = "{URL Anda : }"
init {
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
apiSerivce = retrofit.create(ApiService::class.java)
}
fun getInstance(token: String) {
val client = OkHttpClient.Builder()
.addInterceptor(AuthReceptor(token))
.build()
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
apiSerivce = retrofit.create(ApiService::class.java)
}
suspend fun login(email:String, password: String) : AuthResponse {
return apiSerivce.login(AuthRequest(email, password))
}
suspend fun profile(token : String) : UserResponse {
getInstance(token)
return apiSerivce.profile()
}
}
Sampai disini kita sudah dapat mengirimkan token pada endpoint "/user".Sekian selamat mencoba… Terimakasih .. :-)