背景:
我在API 21中遇到了非常令人困惑的行为Webview
,而在在真实设备中进行测试时,我的行为非常混乱。
我有一个本地HTML5
应用程序(内部资产文件夹),具有以下功能
问题:
执行登录请求后,服务器返回带有会话的cookie。当使用API 21或更高版本的真实设备时,此cookie不会存储在Webview
中。如果我使用模拟器(在本例中为Genymotion),则会正确存储cookie。
更多信息:
执行身份验证的请求具有以下标头:
POST http://myServer/j_spring_security_check HTTP/1.1
Proxy-Connection: keep-alive
Content-Length: 101
access-control-allow-origin: *
accept: application/json
access-control-allow-credentials: true
User-Agent: Framework/1.5.0 (Linux; U; Android 6.0.1; Nexus 5X Build/MMB29Q) App/0.1.1
Origin: file://
content-type: application/x-www-form-urlencoded
Accept-Language: en-US
X-Requested-With: app.package
Host: myServer
通过以下回复:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=4D169E8656DBEDFFA4D17FE8D436A5BA; Expires=Fri, 19-Feb-2016 14:27:55 GMT; Path=/; HttpOnly
Content-Type: application/json;charset=UTF-8
Content-Length: 43
Date: Fri, 19 Feb 2016 14:17:55 GMT
Cookie未存储在API 21或更高版本的设备中。相同的请求/响应在其余设备+所有模拟器中都能正常工作
澄清:
此标记在应用内启用:
android.webkit.CookieManager.setAcceptFileSchemeCookies(true);
(在实例化CookieManager或webview之前,如documentation所述)
if(VERSION.SDK_INT >= 21) {
CookieManager.getInstance().setAcceptThirdPartyCookies(this.nativeWebView, true);
}
如果在进行身份验证后,我会访问Cookie数据存储区
检查" hasCookies"方法,我得到false
。
两步auth服务实际上从相同的端点调用3个不同的路径。没有存储生成此服务的响应的cookie。我不知道这是否相关。
在进行简单身份验证(到其他服务器)时,Cookie会正确存储在所有设备模拟器中。
我使用的是Angular 1.5
我知道该服务正在使用http
而不是https
。这将在未来解决。
我在控制台中没有收到任何错误消息。
问题:
网页视图中是否存在阻止Cookie存储的内部安全措施?为什么它适用于仿真器(有根设备)而不是真实设备?这真让我烦恼。
答案 0 :(得分:1)
如果使用window.fetch完成网络请求,您可能需要添加:
fetch('/ something',{credentials:'same-origin'})//或'include'
在chrome上,window.fetch默认将凭据标志设置为'省略',并且cookie存储中不存储任何cookie。有关此错误的更多详细信息,请访问:https://bugs.chromium.org/p/chromium/issues/detail?id=477523