xamarin.forms - 将 JWT 令牌作为 Xamarin WebView 中的标头传递
问题描述
我正在使用 Xamarin 表单 WebView 控件来显示使用身份验证 JWT 令牌的页面。我在 Microsoft 站点或任何博客中都找不到任何这样做的示例。
我找到的最接近的答案是为每个平台(iOS 和 Droid)中的控件创建一个渲染器。但是我不确定应该在哪个事件上覆盖请求以及可以传递 auth 标头的格式。感谢任何帮助。
解决方案
你可以试试下面的方法:
对于安卓:
public class FormsWebViewRenderer : ViewRenderer<Xamarin.Forms.WebView, Android.Webkit.WebView>
{
Android.Content.Context _localContext;
public FormsWebViewRenderer(Context context) : base(context)
{
_localContext = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
Dictionary<string, string> headers = new Dictionary<string, string>
{
["A-custom-header"] = "a custom value"
};
Android.Webkit.WebView webView = Control as Android.Webkit.WebView;
if (Control == null) {
webView = new Android.Webkit.WebView(_localContext);
SetNativeControl(webView);
}
webView.Settings.JavaScriptEnabled = true;
webView.Settings.BuiltInZoomControls = true;
webView.Settings.SetSupportZoom(true);
webView.ScrollBarStyle = ScrollbarStyles.OutsideOverlay;
webView.ScrollbarFadingEnabled = false;
webView.SetWebViewClient(new FormsWebViewClient(headers));
UrlWebViewSource source = Element.Source as UrlWebViewSource;
webView.LoadUrl(source.Url, headers);
}
}
public class FormsWebViewClient : Android.Webkit.WebViewClient
{
public Dictionary<string, string> headers { get; set; }
public FormsWebViewClient(Dictionary<string, string> requestHeaders)
{
headers = requestHeaders;
}
public override void OnPageStarted(Android.Webkit.WebView view, string url, Android.Graphics.Bitmap favicon)
{
base.OnPageStarted(view, url, favicon);
System.Diagnostics.Debug.WriteLine("Loading website...");
}
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
base.OnPageFinished(view, url);
System.Diagnostics.Debug.WriteLine("Load finished.");
}
public override void OnReceivedError(Android.Webkit.WebView view, IWebResourceRequest request, WebResourceError error)
{
base.OnReceivedError(view, request, error);
}
}
对于 iOS:
public class FormsWebViewRenderer : ViewRenderer<WebView, UIWebView>
{
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
var webView = Control as UIWebView;
if (webView == null) {
webView = new UIWebView();
SetNativeControl(webView);
}
webView.ScalesPageToFit = true;
webView.LoadStarted += (object sender, System.EventArgs evtArgs) => {
System.Diagnostics.Debug.WriteLine("Loading...");
};
webView.LoadFinished += (object sender, System.EventArgs evtArgs) => {
System.Diagnostics.Debug.WriteLine("Load finished.");
};
if (e.NewElement != null) {
UrlWebViewSource source = (Xamarin.Forms.UrlWebViewSource)Element.Source;
var webRequest = new NSMutableUrlRequest(new NSUrl(source.Url));
var headerKey = new NSString("A-custom-header");
var headerValue = new NSString("a custom value");
var dictionary = new NSDictionary(headerKey, headerValue);
webRequest.Headers = dictionary;
this.Control.LoadRequest(webRequest);
}
}
}
推荐阅读
- google-apps-script - 从另一个单元格中减去一个单元格中的值的脚本
- list - 如何在列表中找到比前一个值增加不到 10% 的值
- qt - 连接自定义滚动条和 Flickable
- php - 为什么这个 PDO 准备好的语句不更新记录?
- django - 导航到不同的页面而不是 Ajax 调用
- asp.net-core - Hangfire - DisableConcurrentExecution - 如果在方法参数中传递相同的值,则防止并发执行
- plantuml - 如何用plantUML显示堆叠的卡片结构
- java - UnsupportedClassVersionError:org/sonar/api/utils/SonarException:不支持的major.minor版本52.0
- java - Rest Assured 的 Kotlin 扩展在 Then 块执行期间产生 java.lang.IllegalAccessError
- cassandra - Cassandra 集群可以有偶数个节点吗?