Estou tentando fazer um cliente CLI para uma API. Depois que o usuário faz login na API (por meio de um comando login na CLI), a API cria uma sessão e emite um cookie com Max-Age/Expiry.
No cliente, idealmente, eu gostaria de obter esse cookie, persisti-lo no disco e usá-lo enquanto não estiver expirado. Estou usando o net/http/cookiejar e https://github.com/nhatthm/go-cookiejar para persistência. Mas agora me sinto um pouco preso porque todos os cookies no Jar têm uma Expiry de 0001-01-01 00:00:00 +0000 UTC ou Max-Age de 0. Mesmo que o arquivo persistido esteja mostrando uma entrada Expires.
Tentei simplesmente verificar o cookie logo após fazer a solicitação, o que o configuraria para ver se o problema estava na biblioteca de terceiros, mas o jar também não armazenou nenhuma informação sobre a expiração do cookie e também recebi 0001-01-01 00:00:00 +0000 UTC.
Código de exemplo do teste mencionado acima:
func (c *Client) SetupJar() {
jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
if err != nil {
log.Panic(err)
}
c.Http.Jar = jar
}
func (c *Client) foo() {
fmt.Println("Cookies before request")
for _, c := range c.Http.Jar.Cookies(u) {
fmt.Println(c, c.Expires, c.Path)
}
// Request done here
fmt.Println("Cookies after request")
for _, c := range c.Http.Jar.Cookies(u) {
fmt.Println(c, c.Expires, c.Path)
}
}
Quais saídas:
Cookies before request
Cookies after request
session=MJe4jKguS4TWcafwbDauJxsVdN4DibnHVknddXzOyGU.bc6dO7-zrhWfv4yl2SXSE0KaKtQ 0001-01-01 00:00:00 +0000 UTC
Até o c.Path está vazio
O arquivo persistido (se for executado usando a biblioteca de terceiros) tem tudo, no entanto:
{
"localhost": {
"localhost;/;session": {
"Name": "session",
"Value": "MJe4jKguS4TWcafwbDauJxsVdN4DibnHVknddXzOyGU.bc6dO7-zrhWfv4yl2SXSE0KaKtQ",
"Quoted": false,
"Domain": "localhost",
"Path": "/",
"SameSite": "",
"Secure": false,
"HttpOnly": true,
"Persistent": true,
"HostOnly": true,
"Expires": "2024-10-11T15:53:14Z",
"Creation": "2024-10-11T16:52:45.000924497+01:00",
"LastAccess": "2024-10-11T16:52:45.000924497+01:00",
"SeqNum": 0
}
}
}
O que estou perdendo aqui?
O método Cookies não é necessário para preencher o campo Expires (porque não é relevante ao enviar cookies).
A implementação do github.com/nhatthm/go-cookiejar termina com
É por isso que você não vê o tempo de expiração na sua saída de depuração. Mas está tudo bem. O jar funciona como esperado e não enviará cookies expirados .