欠伸展肢体,吟咏心自愉。这篇文章主要讲述Cookie不适用于Apple设备上的WebSocket相关的知识,希望能为你提供帮助。
我一直在WebSocket前阶段设置和检索cookie以识别用户。我认为一切都可以像典型的HTTP交换一样工作。
这在我测试过的所有浏览器上都运行得很完美,但报告开始报告,在iPhone上登录根本不会保留,表示cookie未设置或发送回服务器。
// fret not, safety checks removed for brevityconst (
sessionKeyCookieName string = "session-key"
webSocketPathstring = "/ws"
)func serveWs(w http.ResponseWriter, r *http.Request) {
var sessionKey [sha1.Size]byte
var u *user
for _, cookie := range r.Cookies() {
if cookie.Name != sessionKeyCookieName {
continue
}
slice, err := base64.StdEncoding.DecodeString(cookie.Value)
if err != nil {
continue
} else {
copy(sessionKey[:], slice)
}
}
u, _ = getUserBySessionKey(sessionKey)// regenerate key. TODO: does that add security?
rand.Read(sessionKey[:])header := make(http.Header)
header.Add("Set-Cookie", (&
http.Cookie{
Name:sessionKeyCookieName,
Value:base64.StdEncoding.EncodeToString(sessionKey[:]),
MaxAge:int(sessionLength.Seconds()),
HttpOnly: true,
Domain:strings.SplitN(r.Host, ":", 2)[0],
}).String())ws, err := upgrader.Upgrade(w, r, header)
if err != nil {
if _, ok := err.(websocket.HandshakeError);
!ok {
log.Println(err)
}
return
}// do things to `user` so their messages go to where they're neededgo c.writePump()
c.readPump()
}
在Firefox网络开发工具上看到的标题
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: eSazcZyZKj2dfa2UWSY+a4wThC8=
Access-Control-Allow-Origin: *
Set-Cookie: session-key=RNStK2z2gAsan7DyNKQ+efjyr7c=;
Domain=redacted.org;
Max-Age=259200;
HttpOnly
我是否跳过允许Safari存储cookie的步骤,或者这是一个问题上游1?
附:我真的想保留这种方法,因为我可以使用仅限HTTP的cookie,这主要是为了确保javascript无法访问它们。
- 看起来加里也有similar issues。简而言之,cookie不会通过WebSockets返回。
Set-Cookie
标头在其他浏览器中工作,我的猜测是它是一个上游问题,特别是ios Safari能够阻止cookie。默认情况下,iOS Safari会阻止第三方Cookie。Can a webpage in mobile Safari check whether Settings > Safari > Accept Cookies 'From visited' or 'Always' is selected?
如果cookie被阻止,您将无法使用它们。如果您需要cookie,请通过在
enabled=1
等登录页面上设置cookie来检测支持,然后在/ws
处理程序中检查它。如果它出现空白并且cookie被阻止,您可以尝试重定向到/please-enable-cookies
以要求用户为您的站点启用cookie。另一种选择是将签名的会话数据存储在本地存储中,并将其包含在
Authorization
头中的每个请求中。 https://jwt.io/另一答案TLDR:这是
HttpOnly
旗帜。看来虽然有些浏览器允许
Set-Cookie
头在WebSocket连接的响应中有HttpOnly
标志,但iOS Safari认为这种情况是“非HTTP”并阻止了这种情况。有趣的是,虽然无法设置
HttpOnly
cookie,但在连接WebSocket时会在请求标头中发送HttpOnly
cookie。这留下了一对选项:- 增加风险并省略
HttpOnly
; - 使用另一个普通的HTTP请求设置您的cookie,很可能是一个甚至没有响应主体的请求。
推荐阅读
- Android Photo Gallery不会从OnActivityResult中的数据返回正确的Uri
- Android - 欧盟Cookie法
- Android - 保持会话活动直到关闭(直到用户注销)
- 带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie
- 把iframe放在Android应用程序上
- Ionic(无法在Android上的iFrame中显示facebook嵌入式帖子)
- 如何在Spring Boot控制器类中传递参数(app正在使用Spring Security)
- Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段
- 刷新/重新加载Angular 2 Web App