【问题标题】:GitHub failing to parse key correctly GoLang API RequestGitHub 无法正确解析密钥 GoLang API 请求
【发布时间】:2015-11-14 14:37:30
【问题描述】:

因此,以下代码接收一个公钥,该公钥被创建,然后传递给一个对象,该对象随后被编组为 json。然后将此 json 传递到 http 请求中。 Github 正在正确解析 json,但返回 ssh 密钥无效。如果我复制内容并上网粘贴密钥,它可以正常工作。

我确实编辑了密钥以删除密钥的 user@hostname 部分(我总是这样做,即使我知道它不安全),看看是否是问题所在。

func addKeyToGitHub(token string, comment string, publickey []byte) (*http.Response, error) {
    if token == "" {
        fmt.Println("Please create a token that has 'write:public_key' scope")
        open.Run(githubAPPURL)
        ir := bufio.NewReader(os.Stdin)
        fmt.Print("Enter Token: ")
        token, _ = ir.ReadString('\n')
    }
    k := string(publickey)
    //Removes unwanted host at end of file
    array := strings.Split(k, " ")
    array = array[:len(array)-1]
    k = strings.Join(array, " ")
    fmt.Println(k)
    b := &githubBody{Title: comment, Key: k}
    body, err := json.Marshal(b)
    if err != nil {
        return nil, err
    }
    req, err := http.NewRequest("POST", githubAPIURL+"user/keys", bytes.NewBuffer(body))
    if err != nil {
        return nil, err
    }
    req.Header.Set("Authorization", "token "+token)
    req.Header.Set("Content-Type", "application/json")
    fmt.Println(req)
    client := http.Client{}
    return client.Do(req)
}

这是它的输出

Please create a token that has 'write:public_key' scope
Enter Token: 3310b4ef5d0dbbb8687b992e6f78e02cd34e4d6d
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7zwo/h3mVL2RwOyMeUyGZblLT+nZy9pS6akUMSiOaVkphCdQzoHH/6xbDPiTKNlXC+1JYmQq4DaeglFdVc+FQHp3ZlbhZp6YPemXHnGtKamtQrJHS+HA7zE+F3xPzLQlVTgUdlE4ckU0THRK7WdwXa1sSMO2UNBrn7MGZ4wskU4PO8QFBjFHN0e5SIv2mlF/Oi1FoSRHIEohHAY6JSE8lnxkYFA5XeVkygLFQbZ7dKpVaZg4Y1LvrZUnThmI+e1QxP9ttUj5Ike6wFewBTvTjtPb8hkEHp3GuwjmwN9SKIW4d5bmrJtGxQjYmY4PHhW5DnySBQWBeOnQxhqVQFqlN
&{POST http://github.com/api/v3/user/keys HTTP/1.1 1 1 map[Authorization:[token 3310b4ef5d0dbbb8687b992e6f78e02cd34e4d6d] Content-Type:[application/json]] {{"Key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7zwo/h3mVL2RwOyMeUyGZblLT+nZy9pS6akUMSiOaVkphCdQzoHH/6xbDPiTKNlXC+1JYmQq4DaeglFdVc+FQHp3ZlbhZp6YPemXHnGtKamtQrJHS+HA7zE+F3xPzLQlVTgUdlE4ckU0THRK7WdwXa1sSMO2UNBrn7MGZ4wskU4PO8QFBjFHN0e5SIv2mlF/Oi1FoSRHIEohHAY6JSE8lnxkYFA5XeVkygLFQbZ7dKpVaZg4Y1LvrZUnThmI+e1QxP9ttUj5Ike6wFewBTvTjtPb8hkEHp3GuwjmwN9SKIW4d5bmrJtGxQjYmY4PHhW5DnySBQWBeOnQxhqVQFqlN","Title":"dixon@homedesktop"}} 418 [] false github.com map[] map[] <nil> map[]   <nil> <nil>}
Status 422
Body: {"message":"Validation Failed","documentation_url":"https://developer.github.com/v3/users/keys/#create-a-public-key","errors":[{"resource":"PublicKey","code":"custom","field":"key","message":"key is invalid. It must begin with 'ssh-rsa', 'ssh-dss', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', or 'ecdsa-sha2-nistp521'. Check that you're copying the public half of the key"}]}

我已经删除了 ssh 密钥和令牌,所以请不要告诉我为什么我不应该发布这些。

我知道在请求之前所有内容都已被授权并正确解析(我测试过错误的令牌和错误的 json 格式都返回不同的错误)但我不知道为什么这不起作用。我试图构建 json 字符串,将其转换为字节数组并以相同的结果传递它。

我不知道这是否重要,但我是通过 VPN 进行的(我将地址更改为显示 github 而不是实际地址)。我已经通过 PostMan(不使用 VPN)测试了这个调用并且它有效,所以我知道服务器有这些 api 调用。

【问题讨论】:

    标签: json api github go


    【解决方案1】:

    您的 OAuth 令牌没有 write:public_key 范围。 Scopes

    【讨论】:

      【解决方案2】:

      creating a public key 的 GitHub API 文档给出了一个请求正文包含小写键的示例:

      {
        "title": "octocat@octomac",
        "key": "ssh-rsa AAA..."
      }
      

      当您的请求键的第一个字符大写时:

      {
        "Title": "octocat@octomac",
        "Key": "ssh-rsa AAA..."
      }
      

      我认为解决此问题的最简单方法是在 githubBody 结构上使用 json 结构标签。例如:

      type githubBody struct {
          Title string `json:"title"`
          Key string `json:"key"`
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 2015-10-18
        • 2020-04-16
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多