【问题标题】:FFImageLoading: How to add authentication?FFImageLoading:如何添加身份验证?
【发布时间】:2018-07-01 23:16:46
【问题描述】:

我正在尝试在我的 Xamarin.iOS 和 Xamarin.Android 应用程序中使用 FFImageLoading 从 url 加载图像。所有网址都需要身份验证..

我还在使用modernhttpclient 进行所有其他休息呼叫。对于modernhttpclient,这就是我添加身份验证的方式

var cookieHandler = new NativeCookieHandler ();
var messageHandler = new NativeMessageHandler (false, false, cookieHandler);
cookieHandler.SetCookies (RestApiPaths.cookies);
using (var client = new HttpClient (messageHandler)) {
client.DefaultRequestHeaders.TryAddWithoutValidation ("User-Agent", GetUserAgent (platform));
var r = await client.GetAsync (new Uri (url));

它运行良好。我为 FFImageLoading 做了同样的事情,

var cookieHandler = new NativeCookieHandler ();
var messageHandler = new NativeMessageHandler (false, false, cookieHandler);
cookieHandler.SetCookies (RestApiPaths.cookies);
var client = new HttpClient (messageHandler);
client.DefaultRequestHeaders.TryAddWithoutValidation ("User-Agent", RestApiPaths.GetUserAgent (Constants.__IOS__));

ImageService.Instance.Initialize (new Configuration {
    HttpClient = client
});

ImageService.Instance.LoadUrl (url).Into (ArticleImageView);

但不幸的是,它不起作用。没有图像被加载。我知道这是身份验证的问题。我尝试使用另一个不需要身份验证及其工作的 url。有人可以告诉我应该怎么做才能让它工作。

编辑:

我从Authentication-Support尝试过这个

public class AuthenticatedHttpImageClientHandler : HttpClientHandler
{

    public AuthenticatedHttpImageClientHandler()
    {

    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("Cookie", RestApiPaths.cookie);
        request.Headers.Add("User-Agent", RestApiPaths.GetUserAgent(Constants.__IOS__));
        return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
}

然后:

ImageService.Instance.Initialize (new Configuration {
    HttpClient = new HttpClient(new AuthenticatedHttpImageClientHandler())
});

但还是不行..

【问题讨论】:

  • 您是否查看过此文档:Authentication Support?似乎您需要创建自己的处理程序来添加令牌并在HttpClient 中使用此处理程序。
  • @GraceFeng-MSFT 请看我的编辑

标签: xamarin xamarin.ios xamarin.android ffimageloading


【解决方案1】:

我是这样做的

ImageService.Instance.Initialize(new Configuration {
    HttpClient = NetworkHelper.GetAuthenticatedHttpClient(Constants.__IOS__)
});
ImageService.Instance.LoadUrl(url).Into(imageView);

NetworkHelper.GetAuthenticatedHttpClient 在我的例子中返回带有所需标头和身份验证令牌的 HttpClient。

public static HttpClient GetAuthenticatedHttpClient(int platform)
{
     HttpClient client = new HttpClient(messageHandler);
     client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", GetUserAgent(platform));
     client.DefaultRequestHeaders.TryAddWithoutValidation("X-Time-Zone", timezone);
     client.DefaultRequestHeaders.TryAddWithoutValidation("appVersion", CommonHelper.AppVersion);
     client.DefaultRequestHeaders.TryAddWithoutValidation("X-Auth", GetAuthToken());
     return client;
}

您只需Instance.Initialize 一次

【讨论】:

  • 对我来说,问题在于 User-Agent 标头。
  • 如果我必须更改每个 url 的标头 Host,我该怎么办?每个 url 的域不同。
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2015-12-05
  • 2015-04-12
相关资源
最近更新 更多