Cookie不会存储在Android Webview API 21及更高版本中

Jbe*_*dev 5 cookies android http webview angularjs

背景:

Webview在API 21中遇到了一个非常令人困惑的行为,在真实设备中进行测试时.

我有一个本地HTML5应用程序(内部资产文件夹)具有以下功能

  • 登录(2步验证).
  • 根据身份验证显示项目列表.

问题:

执行登录请求后,服务器返回会话cookie.Webview使用API​​ 21或更高版本的真实设备时,此cookie不会存储.如果我使用模拟器(在本例中为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
Run Code Online (Sandbox Code Playgroud)

通过以下回复:

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
Run Code Online (Sandbox Code Playgroud)

Cookie未存储在API 21或更高版本的设备中.相同的请求/响应在其余设备+所有模拟器中都能正常工作

澄清:

(在实例化CookieManager或webview之前,正如文档所述)

if(VERSION.SDK_INT >= 21) {

    CookieManager.getInstance().setAcceptThirdPartyCookies(this.nativeWebView, true);
}
Run Code Online (Sandbox Code Playgroud)
  • 如果在进行身份验证后,我访问cookie数据存储区并检查" hasCookies "方法,我明白了false.

  • 两步auth服务实际上从相同的端点调用3个不同的路径.没有存储生成此服务的响应的cookie.我不知道这是否相关.

  • 在进行简单身份验证(到不同的服务器)时,cookie会正确存储在所有设备模拟器中.

  • 我正在使用Angular 1.5

  • 我知道该服务正在使用http而不是https.这将在未来解决.

  • 我在控制台中没有收到任何错误消息.

问题:

Web视图中是否存在阻止Cookie存储的内部安全措施?为什么它适用于仿真器(有根设备)而不是真实设备?这真让我烦恼.

小智 1

如果网络请求是使用 window.fetch 完成的,您可能需要添加:

fetch('/something', { credential: 'same-origin' }) // 或 'include'

在 chromium 上,window.fetch 的凭据标志默认设置为“省略”,并且没有 cookie 存储到 cookie 存储中。有关此错误的更多详细信息,请访问:https://bugs.chromium.org/p/chromium/issues/detail? id=477523