Я пытался выяснить аутентификацию сам, вот мои собственные наблюдения по использованию Refit.
TL; DR: есть альтернативы для установки аутентификации, которые не требуют использования HttpClient, наблюдения 2и 3 ниже.
Существует как минимум три способа обработки аутентификации:
1) Как отмечено на странице GitHub, вы можете передать HttpClient с помощью HttpClientHandler, а в обработчике установитьЗаголовок авторизации.С точки зрения того, почему вам нужно использовать обработчик, я заметил, что Refit установит заголовок Authorization на любое значение, указанное в атрибуте, перед выполнением HTTP-запроса, если вы установили заголовок в HttpClient до создания экземпляра Refit.не будет работать, например, это не будет работать:
[Get("/secretStuff")]
[Headers("Authorization: Bearer")]
Task<Location> GetLocationOfRebelBase();
. . .
var client = new HttpClient() { BaseAddress = new Uri("https://the.end.point/") };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", someToken);
var api = RestService.For<IMyRestService>(client);
var location = await api.GetLocationOfRebelBase();
Заголовок Авторизации будет "Авторизация: Носитель", токена там не будет.Вам необходимо изменить HttpClient непосредственно перед выполнением HTTP-запроса в HttpClientHandler (или DelgatingHandler).
2) При создании нового экземпляра клиента Refit api передайте базовый адрес RestService.Вместо HttpClient и укажите AuthorizationHeaderValueGetter, например:
var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com", new RefitSettings {
AuthorizationHeaderValueGetter = () => {
var token = SomeMethodToGetAToken();
Task.FromResult(token);
}
});
3) Передайте токен в метод api, например:
[Get("/users/{user}")]
Task<User> GetUser(string user, [Header("Authorization")] string authorization);
Это упоминается на странице Refit GitHub: https://github.com/reactiveui/refit#dynamic-headers.