FearghalQA
FearghalQA

Reputation: 265

How to add bearer token to retrofit request in Java

Hi Im trying to add a bearer token to a retrofit call in java, but i cant seem to pass it.

Currently Im logging in with one method and this creates a bearer token and im trying to add the token to the Get Call, but its just returning a 401 error, have I added the token to the call correctly?

@GET("diagnosis/configuration")
Call<ResponseBody> getFavourites (@Query("favourite") Boolean fave,@Header("Bearer Token") String authHeader);

@POST("auth/login")
Call<LoginResponse> postLogin (@Body LoginCredentialsBody body);



public class LoginApiStepDefinition extends TestBaseFix {

Retrofit retrofit = super.buildRetrofit(super.buildOkHttpClient());
RetrofitCallsLogin call = retrofit.create(RetrofitCallsLogin.class);
RetrofitCallsGetFavourites favecall = retrofit.create(RetrofitCallsGetFavourites.class);

private Response<LoginResponse> responseBody;
private String favouritesResponseBody;


String usernameValue;
String passwordValue;


@And("I login with {string} and {string} to return login token")
public void iLoginWithAndToReturnLoginToken(String username, String password) throws Exception {

    LoginApi(username, password);

}


public String LoginApi(String username, String password) throws Exception {


    usernameValue = username;
    passwordValue = password;

    //gets fixture ids for the dates
    LoginCredentialsBody login = new LoginCredentialsBody();
    login.setPassword(passwordValue);
    login.setUsername(usernameValue);
    String responseBody = call.postLogin(login).execute().body().toString();
    String requiredString = responseBody.substring(responseBody.indexOf("=") + 1, responseBody.indexOf(","));


    System.out.println(requiredString);


    return token;


}



@Then("I get the list of favourites with {string} and {string}")
public void iGetTheListOfFavouritesWithAnd(String username, String password) throws Exception {

    String favouritesResponseBody = favecall.getFavourites(true, LoginApi(username, password)).execute().body().toString();
    System.out.println(favouritesResponseBody);
}

}

enter image description here

Upvotes: 9

Views: 17425

Answers (2)

Bhoomi Vaghasiya
Bhoomi Vaghasiya

Reputation: 381

To add bearer token in retrofit, you have to create a class that implements Interceptor

public class TokenInterceptor implements Interceptor{

    @Override
    public Response intercept(Chain chain) throws IOException {
   
       //rewrite the request to add bearer token
        Request newRequest=chain.request().newBuilder()
                .header("Authorization","Bearer "+ yourtokenvalue)
                .build();

        return chain.proceed(newRequest);
    }
}

Now add your Interceptor class in OKHttpClient object and add that obejct in Retrofit object:

TokenInterceptor interceptor=new TokenInterceptor();

OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build();

Retrofit retrofit = new Retrofit.Builder()
            .client(client)
            .baseUrl("add your url here")
            .addConverterFactory(JacksonConverterFactory.create())
            .build();

Upvotes: 16

Ramanand Prajapati
Ramanand Prajapati

Reputation: 116

these three class will be your final setup for all types of call

for first call(Login) you do not need to pass token and after login pass jwt as bearer token to authenticate after authentication do not need to pass

public class ApiUtils {
private static  final String BASE_URL="https://abcd.abcd.com/";
public ApiUtils() {
}

public static API getApiService(String token){
    return RetrofitClient.getClient(BASE_URL,token).create(API.class);
}}

2.Using ApiUtils.getapiService you can get the client ,pass jwt or bearer token

public class RetrofitClient {
public static Retrofit retrofit=null;
public static Retrofit getClient(String baseUrl, String token){
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder()
            .readTimeout(60,TimeUnit.SECONDS)
            .connectTimeout(60,TimeUnit.SECONDS)
            .addInterceptor(interceptor)
            .addInterceptor(new Interceptor() {
        @NotNull
        @Override
        public Response intercept(@NotNull Chain chain) throws IOException {
            Request request=chain.request().newBuilder()
                    .addHeader("Authorization", "Bearer " + token)
                    .build();
            return chain.proceed(request);
        }
    }).build();
    if(retrofit==null||token!=null){
        retrofit= new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}}

3 In this Interface you can create methods for get or post requests

public interface API {

@POST("/Api/Authentication/Login")
Call<JsonObject> login(@Body Model userdata);

@POST("/api/Authentication/ValidateSession")
Call<JsonObject> validateSession(@Body MyToken myToken);

@POST("/api/master/abcd")
Call<JsonObject> phoneDir(@Body JsonObject jsonObject);

@Multipart
@POST("/api/dash/UploadProfilePic")
Call<JsonObject> uploadProfile(@Part MultipartBody.Part part);

@FormUrlEncoded
@POST("/api/dashboard/RulesAndPolicies")
Call<JsonObject> rulesAndProcess(@Field("ct") int city);

@FormUrlEncoded
@POST("/api/dashboard/RulesAndPolicies")
Call<JsonObject> rulesAndProcess(
        @Field("city") int city,
        @Field("department") String department,
        @Field("ctype") String ctype
);

Upvotes: 1

Related Questions