Как обновить sh токен, сгенерированный лямбда-API, используя модификацию? - PullRequest
4 голосов
/ 15 января 2020

В настоящее время мой API входа в систему выполняется с использованием лямбды, и ответ также содержит один токен и время его истечения. Есть ли способ, как O'Auth токен refre sh в модификации для лямбда-генерируемого токена? Заранее спасибо. Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 22 января 2020

В Retrofit нет определенного API для реализации этого поведения, потому что Retrofit использует OkHttp для обработки сетевых операций. Но вы могли бы добиться этого, внедрив интерфейс Authenticator клиента OkHttp, который вы передаете конструктору Retrofit. OkHttp вызов Authenticator для credentials, когда код ответа 401 несанкционированная ошибка, а затем повторная попытка вызова неудачного запроса. Вы можете реализовать Authenticator следующим образом:

public class TokenAuthenticator implements Authenticator {

    ApiService apiService;

    TokenAuthenticator(ApiService apiService){
        this.apiService = apiService;
    }

    @Override
    public Request authenticate(Route route, Response response) throws IOException {

        // Refresh your token using a synchronous request
        String newToken = apiService.refreshToken().execute().body();

        // Add new token to the failed request header and retry it
        return response.request().newBuilder()
                .header("Authorization", newToken)
                .build();
    }
}

И затем передать TokenAuthenticator OkHttpClient следующим образом:

OkHttpClient okHttpClient =  new OkHttpClient().newBuilder()
        .authenticator(new TokenAuthenticator(apiService))
        .build();

И, наконец, передать клиент OkHttpClient Модифицированный строитель:

Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(BuildConfig.API_BASE_URL)
                .build();
2 голосов
/ 25 января 2020

вы можете создать Interceptor, который возвращается к активности входа в систему, когда любой запрос возвращает 401, чтобы обновить sh токен

public class ErrorInterceptor implements Interceptor {
    Context context;

    public ErrorInterceptor(Context context) {
        this.context = context;
    }

    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        // before request
        Request request = chain.request();

        // execute request
        Response response = chain.proceed(request);


        // after request

        // inspect status codes of unsuccessful responses
        switch (response.code()) {
            case 401:
                Intent intent = new Intent(context, Login.class);
                context.startActivity(intent);

                // do something else
                Log.e("TEST", "Unauthorized error for: " + request.url());

                // perhaps throw a custom exception ?
                throw new IOException("Unauthorized !!");
        }

        return response;
    }
}

, затем вы можете добавить ErrorInterceptor к вашему OkHttpClient

  OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor( new ErrorInterceptor(context))
                .build();
...