Работаете с модификацией access_token для Android?

В своем приложении я подключаюсь к серверу и должен получить успешный ответ на мою дальнейшую работу, после такого типа ответа я обычно получаю два токена (доступ + обновление). Для дальнейших действий я должен использовать свой токен доступа, потому что я не смогу получить данные. Срок действия этого токена обычно истекает через 30 минут. Я не могу понять, как я могу получить новый токен с сервера без сбоев моего приложения. Я видел несколько вопросов, и этот Обновление токена OAuth с помощью Retrofit без изменения всех вызовов был лучшим, на мой взгляд. Но я не могу понять, как это использовать для меня. Сейчас я использую такой интерфейс:

public interface APIService {
    @Headers("Content-type: application/json")
    @POST("/v1/login")
    Call<Post> auth(@Body Post body);

    @Headers({"Content-type: application/json",
            "Authorization: Bearer access_token"})
    @GET("/v1/message/list")
    Call<Message> getInMess(@Query("type") int type, @Query("offset") int offset);
}

туда я должен вручную вставить свой токен доступа.

А затем в своем классе MainActivity я инициализирую свой интерфейс:

public void sendPost() 
    {
        final EditText titleEt = findViewById(R.id.login);
        final EditText bodyEt = findViewById(R.id.password);
        final String a = titleEt.getText().toString().trim();
        final String b = bodyEt.getText().toString().trim();
        saveData();
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://server/")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        APIService mAPIService = retrofit.create(APIService.class);
        //retrofit.create(APIService.class);

        mAPIService.auth(new Post(a, b)).enqueue(new Callback<Post>() {
            @Override
            public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) {
                if (response.isSuccessful()) {
                    Toast.makeText(LoginActivity.this, "Post submitted to API.", Toast.LENGTH_LONG).show();
                    Intent intent = new Intent(LoginActivity.this, SecondScreen.class);
                    findViewById(R.id.btn_submit).getBackground().setColorFilter(Color.parseColor("#1cd000"), PorterDuff.Mode.MULTIPLY);
                    startActivity(intent);
                } else {
                    Toast.makeText(LoginActivity.this, "Unable to submit post to API.Error!!!", Toast.LENGTH_LONG).show();
                    findViewById(R.id.btn_submit).getBackground().setColorFilter(Color.parseColor("#FF0000"), PorterDuff.Mode.MULTIPLY);
                }
            }

            @Override
            public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) {
                Toast.makeText(LoginActivity.this, "Unable to submit post to API.", Toast.LENGTH_LONG).show();

            }
        });
    }

Пожалуйста, помогите мне понять стратегию моего дальнейшего развития, потому что я не могу решить свою проблему.

P.S. Извините за мой плохой английский))

да, я пытался добавить заголовок, но мой сервер его не понял ((

Andrew 26.07.2018 14:51
0
1
303
1

Ответы 1

Вам нужно перехватить запрос и добавить заголовок в свой перехватчик. Я использую это в своих приложениях:

public class AuthenticationInterceptor implements Interceptor {


    public AuthenticationInterceptor(Context context) {

    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        if (!YOUR_TOKEN.isEmpty()) {
            Request authenticatedRequest = request.newBuilder().header("Authorization", "Bearer:" + YOUR_TOKEN).build();
            return chain.proceed(authenticatedRequest);
        }
        return chain.proceed(request);
    }
}

где мне нужно вставить ваш код в свой класс mainactivity и где я могу получить свой токен без ручной вставки, может быть, мое приложение получит его автоматически?

Andrew 26.07.2018 15:00

Вам необходимо указать свой токен с вашим методом хранения. Лично я использую SharedPreferences

Flyzzx 26.07.2018 15:02

но раньше мне нужно было проанализировать свой ответ json с помощью следующего токена?

Andrew 26.07.2018 15:03

Первый шаг - это логин. После того, как вы вошли в систему, у вас есть свой токен, который вы можете сохранить с помощью множества различных решений (локальная база данных, общие настройки и т. д.). Затем вы предоставляете свой токен перехватчику, который добавит заголовок для каждого запроса, если токен присутствует.

Flyzzx 26.07.2018 15:04

ок, кажется, я понял твои мысли, но как мне получить этот токен из ответа json? Я читал о синтаксическом анализе, так что это звучит как очень полезный способ получения данных из json (но я не знаю, как я могу это сделать, поэтому, возможно, я изучу его)

Andrew 26.07.2018 15:07

Да, вам нужно проанализировать ответ json, содержащий ваш токен, а затем сохранить его в своем приложении. См. github.com/google/gson, чтобы легко преобразовать Json в объект в Java

Flyzzx 26.07.2018 15:09

Другие вопросы по теме