【问题标题】:Why doesn't cURL send expires/max-age value of cookie back to server ?为什么 cURL 不将 cookie 的 expires/max-age 值发送回服务器?
【发布时间】:2016-12-05 15:57:25
【问题描述】:

我正在使用 Java 中的 Netty.io 框架构建服务器,但在验证请求时遇到了问题。

在验证请求时,我试图通过检查 sessionId 来验证它,它是 expiry

if (sessionId == correctSessionId && expiry < currentTime) {
   // then mark the request as authenticated.
} 

但是,每当我向服务器发送请求时(在我登录并收到适当的过期 cookie 后),服务器端都没有收到过期/最长期限。我做错了什么?

登录请求:

curl -b cookies.txt -c cookies.txt -POST http://localhost:8080/api/v1/account/login -H 'content-type: application/json' -d '{"mobile": "123", "password": "123"}' -v

输出:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> POST /api/v1/account/login HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
> content-type: application/json
> Content-Length: 36
>
* upload completely sent off: 36 out of 36 bytes
< HTTP/1.1 200 OK
* Replaced cookie sessionId="efB9DYHl46aARJMtW59fSKuf+wVtpZ0Y0eveJiLMLH+lEBfvHjzaow==" for domain localhost, path /api/v1/account/, expire 1469968200
< Set-Cookie: sessionId=efB9DYHl46aARJMtW59fSKuf+wVtpZ0Y0eveJiLMLH+lEBfvHjzaow==; Max-Age=180; Expires=Sun, 31 Jul 2016 12:30:00 GMT
* no chunk, no close, no size. Assume close to signal end
<
* Closing connection 0
{"id":"579d3d9902dd1134817edefc","name":"admin","mobile":"123","email":null,"audit":{"createdTime":1469922712940,"createdBy":null,"modifiedTime":1469922712940,"modifiedBy":null}}

注意 Set-cookie 标头及其到期日期。服务器正确发送。

Cookies.txt 文件:

# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

localhost FALSE /api/v1/account/  FALSE 1469968200  sessionId efB9DYHl46aARJMtW59fSKuf+wVtpZ0Y0eveJiLMLH+lEBfvHjzaow==

cookies.text 也正确存储值。

访问需要认证的资源的curl请求:

curl -c cookies.txt -b cookies.txt -XGET http://localhost:8080/api/v1/account/details -H 'content-type: application/json' -v

它的输出:

*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /api/v1/account/details HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
> Cookie: sessionId=efB9DYHl46aARJMtW59fSKuf+wVtpZ0Y0eveJiLMLH+lEBfvHjzaow==
> content-type: application/json
>
< HTTP/1.1 401 Unauthorized
* no chunk, no close, no size. Assume close to signal end
<
* Closing connection 0
Session Unauthorized. Please login%

SessionId 已发送,但没有过期或 max-age。为什么?

我错过了什么?

【问题讨论】:

  • 为什么客户端需要发送有效期?服务器应该存储会话的到期日期并将其与当前时间进行比较,而不是客户端发送的任何信息。永远不要相信客户!

标签: java curl cookies netty


【解决方案1】:

curl 不会将其发回,因为它遵循 HTTP cookie 协议(请参阅RFC6265),并且它说客户端应该只为每个 cookie 发送name=val。过期时间等元数据由服务器发送,由客户端处理,但从不发回。

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 2022-12-12
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2023-03-15
    • 2021-04-28
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多