//Retrofit Libraries
implementation 'com.squareup.retrofit2:retrofit:2.7.0'
implementation 'com.squareup.retrofit2:converter-gson:2.7.0'
//OkHttp Libraries
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2'
Retrofit Basic Authentication in Android
Upasana | December 30, 2019 | 2 min read | 3,730 views
Approach
You will have to create a Request interceptor (BasicAuthInterceptor
) which extends Interceptor
class of OkHttp library. Then, override intercept function and add your credentials into the request. Generate basic credentials with Credentials class of package OkHttp by using its basic function. Pass username and password to basic function as function arguments and it will return base64 encoded string. Use this string with Authorization header.
Gradle setup
Add Retrofit and OkHttp dependencies in your build.gradle
file.
Interceptor for Basic Auth
OkHttp Interceptors are a powerful mechanism that can monitor, rewrite, and retry calls. We will develop an interceptor that will inject Basic Auth headers to each outgoing request.
class BasicAuthInterceptor(username: String, password: String): Interceptor {
private var credentials: String = Credentials.basic(username, password)
override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
var request = chain.request()
request = request.newBuilder().header("Authorization", credentials).build()
return chain.proceed(request)
}
}
We Are almost done, Now we just need to add this interceptor in your OkHttp Client and then add OkHttp Client in your retrofit instance.
val client = OkHttpClient.Builder()
.addInterceptor(BasicAuthInterceptor(Username, Password))
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com")
.client(client)
.build()
Complete Solution
class BasicAuthInterceptor(username: String, password: String): Interceptor {
private var credentials: String = Credentials.basic(username, password)
override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
var request = chain.request()
request = request.newBuilder().header("Authorization", credentials).build()
return chain.proceed(request)
}
}
class BasicAuthClient<T> {
private val client = OkHttpClient.Builder()
.addInterceptor(BasicAuthInterceptor("<username>", "<password>"))
.build()
val gson = GsonBuilder()
.setLenient()
.create();
private val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com")
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
fun create(service: Class<T>): T {
return retrofit.create(service)
}
}
interface DemoRemoteService {
@GET("/profile")
fun getProfile(): Call<Profile>
}
class Demo {
fun loadProfile() {
val call = BasicAuthClient<DemoRemoteService>().create(DemoRemoteService::class.java).getProfile()
call.enqueue(object: Callback<Profile> {
override fun onFailure(call: Call<Profile>, t: Throwable) {
Log.e("DemoClass", t.message, t)
}
override fun onResponse(call: Call<Profile>, response: Response<Profile>) {
if (response.isSuccessful) {
Log.i("DemoClass", "Profile Loaded.")
} else {
Log.e("DemoClass", "Error: ${response.code()} ${response.message()}")
}
}
})
}
}
Creating a Basic Auth server using Spring Boot 2
If you are interested in creating a simple REST API secured by Basic Auth, this spring boot 2 based project will be helpful:
Top articles in this category:
- Retrofit OAuth2 Bearer Token Authentication OkHttp Android
- Kotlin Coroutines with Retrofit
- Service vs Intent Service in Android
- Firebase Cloud Messaging in Android App using Command Pattern
- FirebaseInstanceIdService is deprecated now
- iOS interview questions for 0-3 years experience
- iOS interview experience fresher