问题现象
mui的APP,登录之后调接口仍提示未登录。
诡异的是,之前测试时还正常;而且只有android存在问题,ios正常;而且其他客户类似的场景正常。
问题定位
查看接口的请求头,发现没有带cookie
查看接口的响应头,发现Set-Cookie出现SameSite选项
原因分析
应该就是这个选项导致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属性:
增加Secure属性
proxy_cookie_flags SHAJSESSIONID samesite=none secure;
报需要https安全连接:
改为nosamesite
proxy_cookie_flags SHAJSESSIONID nosamesite nosecure;
成功了:
Nginx下载地址
http://nginx.org/download/nginx-1.19.6.tar.gz
Tomcat相关配置
conf/context.xml
<Context>
<CookieProcessor sameSiteCookies="None" className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
</Context>
conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
<cookie-config>
<secure>false</secure>
</cookie-config>
</session-config>
问题根源
最终找到了原因,是因为shiro从1.3升级到了1.6,cookie默认设置为SameSite=lax!
修改SimpleCookie配置,将sameSite设置为null,secure设置为false即可
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="${autologin.cookie.name:BNATLG}" />
<property name="domain" value="${shiro.cookie.domain:}" />
<property name="path" value="${shiro.cookie.path:}" />
<property name="httpOnly" value="true" />
<property name="sameSite"> <null /> </property>
<property name="secure" value="false" />
<property name="maxAge" value="${autologin.cookie.max.age:2592000}" /><!-- 单位:秒, 默认30天 -->
</bean>
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg name="name" value="BNJSID" />
<property name="path" value="/" />
<property name="httpOnly" value="true" />
<property name="sameSite"> <null /> </property>
<property name="secure" value="false" />
</bean>
Shiro升级原因