Search code examples
androidweb-servicesjwtretrofit2bearer-token

How can I connect to web service with Bearer token?


I'm trying to pull data by connecting to a web service using Retrofit. The web service I will use in my application is encrypted. So I can access it with Bearer token. I also need to renew the Bearer token. I did get Bearer tokens. How can I connect to web service with this Bearer token I got?

Postman : enter image description here

ServiceAPI :

interface ServiceAPI {


    @FormUrlEncoded
    @POST("GetToken")
    fun getGetToken(@Field("grant_type")grant_type:String, @Field("username") username:String, @Field("password") password:String):Call<Token>


    @GET("api/Users")
    fun getUsers(@Header("Authorization") authorization: String): Call<UsersModel>

  
}
 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        getServiceExample()

    }


fun getServiceExample(){
        val BASE_URL = "https://www.exampleserviceid.com/"
        val api = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()

       

        val service = api.create(ServiceAPI::class.java).getGetToken("password","myusername","mypassword")



        service.enqueue(object : Callback<Token>{
            override fun onResponse(call: Call<Token>, response: Response<Token>) {
                if (response.isSuccessful){

                     val gettoken: Token? = response.body()
                    val token = gettoken?.accessToken  //  This is how I get the Bearer token
                    

                }
            }

            override fun onFailure(call: Call<Token>, t: Throwable) {
                
                TODO("Not yet implemented")

            }

        })

    }

Token :

class Token : Serializable {
    @SerializedName("access_token")
    @Expose
    var accessToken: String? = null

    @SerializedName("token_type")
    @Expose
    var tokenType: String? = null

    @SerializedName("expires_in")
    @Expose
    var expiresIn: Int? = null

  
    constructor() {}

    /**
     *
     * @param tokenType
     * @param accessToken
     * @param expiresIn
     */
    constructor(accessToken: String?, tokenType: String?, expiresIn: Int?) : super() {
        this.accessToken = accessToken
        this.tokenType = tokenType
        this.expiresIn = expiresIn
    }

}

UsersModel:

class UsersModel : Serializable {
    @SerializedName("username")
    @Expose
    var username: String? = null

    @SerializedName("userage")
    @Expose
    var userage: String? = null

 
    constructor() {}

    constructor(username: String?, userage: String?) : super() {
        this.username= username
        this.userage= userage

    }

}

How can I connect to web service with this Bearer token I got?

Update :

fun getServiceExample(){
        val BASE_URL = "https://www.exampleserviceid.com/"
        val api = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()

       

        val service = api.create(ServiceAPI::class.java).getGetToken("password","myusername","mypassword")



        service.enqueue(object : Callback<Token>{
            override fun onResponse(call: Call<Token>, response: Response<Token>) {
                if (response.isSuccessful){

                     val gettoken: Token? = response.body()
                    val token = gettoken?.accessToken  //  This is how I get the Bearer token


val httpClient: OkHttpClient.Builder =OkHttpClient.Builder()
                        .callTimeout(60, TimeUnit.SECONDS)
                        .connectTimeout(60, TimeUnit.SECONDS)
                        .readTimeout(60, TimeUnit.SECONDS)
                        .writeTimeout(60, TimeUnit.SECONDS)

                    httpClient.addInterceptor(object: Interceptor {
                        override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
                            val original = chain.request();

                            val request = original.newBuilder()
                                .header("Authorization","Bearer " + token)
                                .method(original.method(), original.body())
                                .build();

                            val Log = Logger.getLogger(MainFragment::class.java.name)
                            Log.warning("Bearer " + token)

                            return chain.proceed(request);
                        }
                    })

                    val client = httpClient.build();
                    val retrofit = Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(client)
                        .build();

                    val service2 = retrofit.create(ServiceAPI::class.java).getUsers()

service2.enqueue(object : Callback<UsersModel>{
                        override fun onResponse(call: Call<UsersModel>, response: Response<UsersModel>) {
                            if (response.isSuccessful){

                                val usersmodeltoken: UsersModel? = response.body()
                                val usernametoken = usersmodeltoken?.username

                                Toast.makeText(context, usernametoken, Toast.LENGTH_SHORT).show()


                            }
                        }

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

                            /*
                            TODO("Not yet implemented")
                             */

                        }

                    })

                    

                }
            }

            override fun onFailure(call: Call<Token>, t: Throwable) {
                
                TODO("Not yet implemented")

            }

        })

    }

update postman : enter image description here


Solution

  • Solution :

     @GET("api/Users")
        fun getUsers(@Header("Authorization") authorization: String): Call<List<UsersModel>>
    
    
    val service2 = retrofit.create(ServiceAPI::class.java).getUsers("Bearer "+tokennn)
    
    
    service2.enqueue(object : Callback<List<UsersModel>> {
                                override fun onResponse(call: Call<List<UsersModel>?>?, response: Response<List<UsersModel>?>?) {
                                    if (response != null) {
                                        if (response.isSuccessful){
                                            val data= response.body()
                                            if (data!= null) {
                                                val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
                                                recyclerView.layoutManager = LinearLayoutManager(this)
                                                recyclerView.adapter = ExampleAdapter(data)
                                            }
                                        }
                                    }
                                }
    
                                override fun onFailure(call: Call<List<UsersModel>?>?, t: Throwable?) {
                                    // TODO("Not yet implemented")
                     
                                }
    
                            })