GitHub cookie文件

GitHub cookiefile

由于 Git 将 cURL 用于 HTTP,因此我能够拥有这样的文件 ~/.netrc [1]:

machine github.com
login 89z
password [Personal access token]

不过,似乎还有另一种选择,即使用 cookie [2]。它看起来 就像语法是这样的:

[http]
   saveCookies = true
   cookiefile = C:/cookie.txt

我的问题是,这可以用来推送到 GitHub 吗?如果是这样,我将如何创建 cookie 文件?

  1. https://curl.se/libcurl/c/CURLOPT_NETRC.html
  2. https://git-scm.com/docs/git-config#Documentation/git-config.txt-httpcookieFile

我想离开 Netrc 的原因是因为并非所有语言都内置了解析支持。无论如何,我发现规范 [1] 和一个流行的实现 [2] 只是假设标记由空格分隔。因此,如果您可以控制 Netrc 文件,那么您可以将每个条目放在自己的行中,这样就很容易解析了。这是 Go 的示例:

package main

import (
   "fmt"
   "net/http"
   "os"
)

func netrc(addr string) (*http.Request, error) {
   home, err := os.UserHomeDir()
   if err != nil { return nil, err }
   file, err := os.Open(home + "/_netrc")
   if err != nil { return nil, err }
   defer file.Close()
   var login, pass string
   fmt.Fscanf(file, "default login %v password %v", &login, &pass)
   req, err := http.NewRequest("GET", addr, nil)
   if err != nil { return nil, err }
   req.SetBasicAuth(login, pass)
   return req, nil
}

func main() {
   req, err := netrc("https://api.github.com/rate_limit")
   if err != nil {
      panic(err)
   }
   res, err := new(http.Client).Do(req)
   if err != nil {
      panic(err)
   }
   fmt.Println(res)
}
  1. https://gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html
  2. https://github.com/curl/curl/blob/33ba0ecf/lib/netrc.c#L87

不,此功能不能用于推送到 GitHub。 GitHub 要求您使用基本身份验证通过 HTTPS 进行推送,而 cookie 不是基本身份验证。

此功能的存在是因为某些公司代理需要它才能正常工作并执行身份验证,并且它的存在仅用于此目的。由于 Web 浏览器对 cookie 施加了大多数非 Web 浏览器用户代理所没有的附加安全措施,因此在 Web 浏览器之外使用 cookie 作为身份验证形式的安全性要低得多,此外支持也很差。

虽然您可以为此使用 .netrc 文件,但最好使用凭据管理器,因为大多数凭据管理器以加密格式而不是磁盘上的纯文本格式存储您的数据。