在Android Webview API 21及以上版本中,Cookie不会被存储。

5

背景:

当我在真实设备上测试 Android API 21 及以上版本的 Webview 时,我遇到了非常困惑的行为。

我的本地应用(在 assets 文件夹内)具有以下功能:

  • 登录(2 步验证)。
  • 根据验证情况显示项目列表。

问题:

在完成登录请求后,服务器返回一个包含会话信息的 cookie。但当使用 Android 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

在 API 21 或更高版本的设备上不会存储 cookie。在其余设备和所有模拟器中,相同的请求/响应工作正常。

澄清:

  • This flags are enabled inside the app:

    android.webkit.CookieManager.setAcceptFileSchemeCookies(true);
    

在实例化CookieManager或webview之前,正如文档所说:

if(VERSION.SDK_INT >= 21) {

    CookieManager.getInstance().setAcceptThirdPartyCookies(this.nativeWebView, true);
}
  • 如果我在身份验证后访问cookie数据存储并检查“hasCookies”方法,我会得到false

  • 两步骤认证服务实际上从同一端点调用了3个不同的路径。生成此服务响应的任何cookie都没有被存储。我不知道这是否相关。

  • 当进行简单身份验证(连接不同服务器)时,在所有设备仿真器中都正确存储cookie。

  • 我正在使用Angular 1.5

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

  • 控制台中没有错误消息。

问题:

Webview中是否有阻止存储cookie的内部安全措施?为什么它在模拟器上工作(这些是rooted设备),但在真实设备上无法工作?这真的很烦人。

1个回答

1
如果使用window.fetch进行网络请求,您可能需要添加以下内容:

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

在Chromium中,默认情况下将credentials标志设置为'omit',并且不会将任何cookie存储到Cookie存储中。更多关于此错误的详细信息请参见:https://bugs.chromium.org/p/chromium/issues/detail?id=477523

是的,那是一项重要的数据:HTTP请求是使用windows.fetch完成的... - Jbeerdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接