Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 615
FearghalQA Avatar asked Apr 23 '20 11:04

FearghalQA


People also ask

How do I add Bearer Token to request?

Bearer token The token is a text string, included in the request header. In the request Authorization tab, select Bearer Token from the Type dropdown list. In the Token field, enter your API key value. For added security, store it in a variable and reference the variable by name.

How do I send a POST request with Bearer Token?

To send a POST JSON request with a Bearer Token authorization header, you need to make an HTTP POST request, provide your Bearer Token with an Authorization: Bearer {token} HTTP header and give the JSON data in the body of the POST message.


2 Answers

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();
like image 118
Bhoomi Vaghasiya Avatar answered Oct 18 '22 00:10

Bhoomi Vaghasiya


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
);
like image 1
Ramanand Prajapati Avatar answered Oct 17 '22 23:10

Ramanand Prajapati