func webView(webView: WKWebView!, decidePolicyForNavigationAction navigationAction: WKNavigationAction!, decisionHandler: ((WKNavigationActionPolicy) -> Void)!) {
var request = NSMutableURLRequest(URL: navigationAction.request.URL)
request.setValue("value", forHTTPHeaderField: "key")
decisionHandler(.Allow)
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我想为请求添加一个标头.我试过,navigationAction.request.setValue("IOS", forKey: "DEVICE_APP")但它不起作用.
请以任何方式帮助我.
这个问题是对“ 在本机应用程序和网站之间共享凭据 ”的补充,因为我们的目标是在相反的方向上共享秘密。
TL; TR:我们如何安全地从Web浏览器应用程序向Native Desktop应用程序共享用户的身份验证/授权状态,因此同一用户不必在Native应用程序中另外进行身份验证?
TS; WM:我们正在研究以下架构:Web应用程序(在用户选择的Web浏览器中运行一些HTML前端UI),本机桌面应用程序(实现自定义协议处理程序),Web API和OAuth2服务,如图所示。

最初,使用授权代码授予流程针对OAuth2服务在Web浏览器应用程序中对用户进行身份验证/授权。
然后,当用户单击我们的基于协议的自定义超链接时,Web浏览器内容可以与本机应用程序进行单向对话。基本上,已经完成了通过Web API在两者之间建立安全的双向后端通信通道的工作。
我们认为,在对通过自定义协议链接从Web浏览器应用程序收到的任何请求采取行动之前,本机应用程序应首先对用户进行身份验证(使用该特定的桌面会话该用户应该是同一个人)。我们认为本机应用程序还应该使用授权码流(带有PKCE)来获取Web API的访问令牌。然后,它应该能够使用相同的Web API安全地验证自定义协议数据的来源和完整性。
但是,对于用户来说,必须两次进行身份验证可能是一个障碍,第一次是在Web浏览器中,第二次是在Native应用程序中,两者同时运行。
因此,存在一个问题:是否有一种方法可以在不损害此体系结构的客户端安全性的情况下,将OAuth2访问令牌(或任何其他授权承载)从Web浏览器应用安全地传递到本机应用?也就是说,Native应用程序可以使用Web浏览器中的身份调用Web API,而不必先验证同一用户?
就个人而言,我看不到如何安全地避免其他身份验证流程。默认情况下,通过自定义应用程序协议进行的通信是不安全的,因为通常这只是调用本机应用程序的命令行参数。与TLS通道不同,它可以被拦截,模拟等。我们可以对自定义协议数据进行加密。尽管如此,无论对本机应用程序进行什么调用来解密(无论是对客户端OS API还是对Web API的一些不受保护的调用),都必须执行,恶意的actor /恶意软件也可能会复制它们。
我想念什么吗?是否有特定于平台的安全解决方案?本机桌面应用程序是Electron应用程序,旨在跨平台。我们的大多数用户都将使用任何受支持的浏览器(甚至包括IE11)在Windows上运行此程序,但是毫无疑问ActiveX或入侵正在运行的Web浏览器实例。
我的iOS UIWebView页面基于Cordova开源框架,我想在其webview URL请求中添加一些自定义http标头,我的解决方案是将它们添加到以下UIWebView委托方法中.
调试显示标题已成功添加,但实际上请求不会将它们删除.使用Wireshark捕获网络数据包,发现只有标准标头可用,没有我的自定义标头.
我的测试基于模拟器(iOS 7.1),任何有此主题经验的人都请一起分享和讨论,提前感谢.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// Add customize http headers in UIWebView request
if([request isKindOfClass:[NSMutableURLRequest class]]) {
NSMutableURLRequest * mRequest = (NSMutableURLRequest *)request;
[mRequest setValue:@"1.1" forHTTPHeaderField:@"appVersion"];
[mRequest setValue:@"iPhone 4S" forHTTPHeaderField:@"deviceModel"];
}
return [super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
}
Run Code Online (Sandbox Code Playgroud)