问题现象
    mui的APP,登录之后调接口仍提示未登录。
    诡异的是,之前测试时还正常;而且只有android存在问题,ios正常;而且其他客户类似的场景正常。

    问题定位
    查看接口的请求头,发现没有带cookie
    查看接口的响应头,发现Set-Cookie出现SameSite选项
    image.png

    原因分析
    应该就是这个选项导致mui无法读取到cookie,调接口不带cookie,服务端就无法识别用户,提示未登录。
    SameSite Cookie是Google推出的一个新cookie属性值,用于防止 CSRF 攻击。
    mui的页面实际上是访问的file://协议的本地html,与http://协议的接口不在同一个域,无法读取到带有lax的cookie。
    android支持SameSite属性,导致问题出现;而ios不支持该属性,因此没有问题。
    所以,把这个属性去掉应该就好了。

    问题定位*
    一开始打算使用proxy_cookie_path将SameSite的lax改为none:
    proxy_cookie_path ~
    SameSite=lax “SameSite=none”;
    一直不生效,以为是正常写错了,试了多次都不行
    原来proxy_cookie_path只能操作path
    Set-Cookie: SHAJSESSIONID=xxx; Path=/; HttpOnly; SameSite=lax
    即Set-Cookie中Path这一段,一个斜杠~~
    后来改用proxy_cookie_flags指令,可以操作成功,但需要nginx/1.19.3以上版本
    中间怀疑是不是tomcat9的问题
    因为受“测试时正常其他客户都正常”所误导,一直没考虑是应用的问题
    结果最后找到问题根源,是因为shiro安全漏洞从1.3升级到了1.6,cookie默认设置为SameSite=lax!

    将SameSite改为none
    proxy_cookie_flags SHAJSESSIONID samesite=none;
    报需要设置secure属性:
    image.png

    增加Secure属性
    proxy_cookie_flags SHAJSESSIONID samesite=none secure;
    报需要https安全连接:
    image.png

    改为nosamesite
    proxy_cookie_flags SHAJSESSIONID nosamesite nosecure;
    成功了:
    image.png

    Nginx下载地址
    http://nginx.org/download/nginx-1.19.6.tar.gz

    Tomcat相关配置
    conf/context.xml

    1. <Context>
    2. <CookieProcessor sameSiteCookies="None" className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
    3. </Context>

    conf/web.xml

    1. <session-config>
    2. <session-timeout>30</session-timeout>
    3. <cookie-config>
    4. <secure>false</secure>
    5. </cookie-config>
    6. </session-config>

    问题根源
    最终找到了原因,是因为shiro从1.3升级到了1.6,cookie默认设置为SameSite=lax!
    image.png

    修改SimpleCookie配置,将sameSite设置为null,secure设置为false即可

    1. <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    2. <constructor-arg value="${autologin.cookie.name:BNATLG}" />
    3. <property name="domain" value="${shiro.cookie.domain:}" />
    4. <property name="path" value="${shiro.cookie.path:}" />
    5. <property name="httpOnly" value="true" />
    6. <property name="sameSite"> <null /> </property>
    7. <property name="secure" value="false" />
    8. <property name="maxAge" value="${autologin.cookie.max.age:2592000}" /><!-- 单位:秒, 默认30天 -->
    9. </bean>
    10. <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    11. <constructor-arg name="name" value="BNJSID" />
    12. <property name="path" value="/" />
    13. <property name="httpOnly" value="true" />
    14. <property name="sameSite"> <null /> </property>
    15. <property name="secure" value="false" />
    16. </bean>

    Shiro升级原因
    Cookie SameSite问题 - 图6