Перехватить вызов для обновления токена GRPC ⇐ Android
-
Anonymous
Перехватить вызов для обновления токена GRPC
Я использую GRPC с прототипом в своем проекте, и у меня есть токены KEY и AUTHORITY для доступа к API сервера. Итак, мне нужно обновить KEY, используя мой AUTHORITY. Я создаю канал следующим образом:
OkHttpChannelBuilder.forAddress(хост, порт) .usePlaintext() .intercept(аутентификация, регистратор) .строить() Мой перехватчик выглядит так:
класс AuthClientInterceptor( частные настройки val: Настройки, частный val keyApi: KeyApi): ClientInterceptor { сопутствующий объект { Private const val ACCESS_TOKEN = "авторизация" } переопределить fun interceptCall(method: MethodDescriptor?, CallOptions: CallOptions?, следующий: Канал): ClientCall { val call = next.newCall(метод, callOptions) val callForwarding = объект: ClientInterceptors.CheckedForwardingClientCall(call) { переопределить funcheckedStart(responseListener: Listener?, headers: Metadata) { синхронизированный (this@AuthClientInterceptor) { val keyCreated = prefs.getAccessKeyCreated() val keyExpires = prefs.getAccessKeyExpires() val currentTime = System.currentTimeMillis() if (currentTime keyExpires) { keyApi.issueNewKey(prefs.getAuthority()) .map { it.data } .doOnSuccess { prefs.setAccessKey(it.token) } .doOnSuccess { prefs.setAccessKeyCreated(it.createdDate) } .doOnSuccess { prefs.setAccessKeyExpires(it.expiresDate) } .blockingGet() } } val keyData = Metadata.Key.of(ACCESS_TOKEN, Metadata.ASCII_STRING_MARSHALLER) если (headers[keyData] == null) { headers.put(keyData, "Носитель ${prefs.getAccessKey()}") } call.start(responseListener, заголовки) } } обратный звонокПереадресация } } Как видите, я просто проверяю текущее время и сравниваю его с датами создания и срока действия токена.
Так вот, мне это не нравится. Я хочу реализовать это:
1) Отправить запрос на сервер;
2) Проверьте ответ. Если это означает, что срок действия моего КЛЮЧА истек, обновите ключ синхронно и повторите запрос (например, аутентификатор).
Но я не нашел решения или какой-либо полезной информации о реализации этого с помощью gRPC. Может ли кто-нибудь мне помочь?
Я использую GRPC с прототипом в своем проекте, и у меня есть токены KEY и AUTHORITY для доступа к API сервера. Итак, мне нужно обновить KEY, используя мой AUTHORITY. Я создаю канал следующим образом:
OkHttpChannelBuilder.forAddress(хост, порт) .usePlaintext() .intercept(аутентификация, регистратор) .строить() Мой перехватчик выглядит так:
класс AuthClientInterceptor( частные настройки val: Настройки, частный val keyApi: KeyApi): ClientInterceptor { сопутствующий объект { Private const val ACCESS_TOKEN = "авторизация" } переопределить fun interceptCall(method: MethodDescriptor?, CallOptions: CallOptions?, следующий: Канал): ClientCall { val call = next.newCall(метод, callOptions) val callForwarding = объект: ClientInterceptors.CheckedForwardingClientCall(call) { переопределить funcheckedStart(responseListener: Listener?, headers: Metadata) { синхронизированный (this@AuthClientInterceptor) { val keyCreated = prefs.getAccessKeyCreated() val keyExpires = prefs.getAccessKeyExpires() val currentTime = System.currentTimeMillis() if (currentTime keyExpires) { keyApi.issueNewKey(prefs.getAuthority()) .map { it.data } .doOnSuccess { prefs.setAccessKey(it.token) } .doOnSuccess { prefs.setAccessKeyCreated(it.createdDate) } .doOnSuccess { prefs.setAccessKeyExpires(it.expiresDate) } .blockingGet() } } val keyData = Metadata.Key.of(ACCESS_TOKEN, Metadata.ASCII_STRING_MARSHALLER) если (headers[keyData] == null) { headers.put(keyData, "Носитель ${prefs.getAccessKey()}") } call.start(responseListener, заголовки) } } обратный звонокПереадресация } } Как видите, я просто проверяю текущее время и сравниваю его с датами создания и срока действия токена.
Так вот, мне это не нравится. Я хочу реализовать это:
1) Отправить запрос на сервер;
2) Проверьте ответ. Если это означает, что срок действия моего КЛЮЧА истек, обновите ключ синхронно и повторите запрос (например, аутентификатор).
Но я не нашел решения или какой-либо полезной информации о реализации этого с помощью gRPC. Может ли кто-нибудь мне помочь?
Мобильная версия