Retrofit2: Как сделать так, чтобы заголовок токена авторизации был динамическим c? - PullRequest
1 голос
/ 29 февраля 2020

Я создаю приложение, которое позволит пользователям входить в систему, используя Basi c Auth.

У меня есть модифицированный клиент, который использует Interceptor для получения токена. Однако он работает только в том случае, если вы указываете адрес электронной почты и пароль, используемые в качестве строки, а не на основе адреса электронной почты и пароля, которые пользователь вводит в форму входа в систему.

В коде, который у меня есть, я устанавливаю учетные данные на электронную почту = "email@test.com" и пароль = "test", и код работает, и пользователь может войти в систему.

Однако мне нужно, чтобы переменная AUTH была динамической c. Все примеры и вопросы, которые я видел, имеют решение, в котором используется электронная почта и пароль * * * * * * * * * * * * * * * * * * * * * * * *1014* .

А как я звоню клиенту, это

.

Call<LoginResponse> call = RetrofitClient
            .getInstance()
            .getApi()
            .userLogin(email, password);


    call.enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            LoginResponse loginResponse = response.body();

            if(response.code() == 200){

                //save user
                //open profile

                Toast.makeText(LoginActivity.this, loginResponse.getToken(), Toast.LENGTH_SHORT).show();
            } else {



                Toast.makeText(LoginActivity.this, "Error Logging in", Toast.LENGTH_SHORT).show();

            }
        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {

        }
    });

1 Ответ

0 голосов
/ 29 февраля 2020

На самом деле, единственное, что вам нужно сделать - это заменить AUTH каким-либо другим источником данных, который можно изменить из любой части вашего кода, где вам нужно

Объяснено. intercept метод вызывается при каждом запросе API, поэтому ваши учетные данные могут быть изменены в любое время 1014 *

public class CredentialsProvider {

    //Some singleton stuff

    private Credentials credentials = Credentials.basic("email@test.com", "test"); //Some initial data

    public void setCredentials(Credentials credentials) {
        this.credentials = credentials
    }

    public Credentials getCredentials() {
        return credentials;
    }

Где-то в коде, где вы хотите изменить учетные данные

{
    CredentialsProvider.getInstance().setCredentials(someNewCredentials);
}

Дооснащение

public class RetrofitClient {

   //Your code

   private CredentialsProvider credentialsProvider;
   // More code

   @Override
   public Response intercept(Chain chain) throws IOException {
       Request original = chain.request();
       Request.Builder requestBuilder = original.newBuilder()
           .addHeader("Authorization", credentialsProvider.getCredentials())
           .method(original.method(), original.body());

           Request request = requestBuilder.build();
           return chain.proceed(request);
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...