【发布时间】:2017-12-10 19:52:51
【问题描述】:
我已经在 WebSocket 之前的阶段设置和检索 cookie 以识别用户。我假设一切都可以通过典型的 HTTP 交换进行。
这在我测试过的所有浏览器上都完美运行,但开始有报告称,在 iPhone 上登录根本不会保留,这表明 cookie 要么未设置,要么未发送回服务器。
// fret not, safety checks removed for brevity
const (
sessionKeyCookieName string = "session-key"
webSocketPath string = "/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 needed
go 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 传回。
【问题讨论】:
-
请注意,非安全 cookie 和安全 cookie 分别存储在 Safari 上,防止安全 cookie 暴露于非安全连接。尝试使用来自
http相关cookie 的wss,或尝试使用https相关cookie 进行ws连接,注定会失败。会不会是您将 TLS 与非 TLS 连接混合在一起? -
不可能,@Myst,我现在没有使用加密。
-
目标主机名是否有任何特殊性(例如“localhost”或非 TLD)?一些浏览器/客户端对其中一些有特殊处理,包括包含 cookie(例如,如果 IE 的域属性为“localhost”,则 IE 不会包含 cookie)。您是否测试过其他主机名?只是猜测:)
-
@HariLubovac 添加了实际发送的标头。这一切都发生在同一个域上。
标签: ios cookies websocket safari