如何通过GitHub的v3 API添加ssh-key?

时间:2013-05-21 14:25:26

标签: github github-api

我正在尝试通过GitHub的v3 API添加一个ssh密钥,但它似乎没有用。

我正在做的是基于here给出的说明。

更具体地说,我正在使用以下内容:

KEY=$( cat ~/.ssh/id_rsa.pub )
TITLE=${KEY/* }
# the '/* ' above deletes every character in $KEY up to and including the last
# space.

JSON=$( printf '{"title": "%s", "key": "%s"}' "$TITLE" "$KEY" )

TOKEN=$( cat /path/to/tokenfile )

curl -s -d "$JSON" "https://api.github.com/user/keys?access_token=$TOKEN"

当我运行上述内容时,我得到的回应是:

{
  "message": "Not Found"
}

...当然,当我签入我的GitHub帐户时,$KEY不属于列出 1 的ssh键。

我做错了什么?

其他详情

如果我只是运行

,我会得到相同的"message": "Not Found"响应
curl -s "https://api.github.com/user/keys?access_token=$TOKEN"

如果我将上面的-s替换为-i,我确实知道返回的状态为404 Not Found。然而,

的返回状态
curl -i "https://api.github.com/user/keys"

401 Unauthorized


1 我知道$TOKEN中的访问令牌很好,因此它不是"message": "Not Found"响应的原因,因为

curl -s "https://api.github.com/user/repos?access_token=$TOKEN"

返回正确的信息,

curl -s "https://api.github.com/user/repos"

返回

{
  "message": "Requires authentication"
}

2 个答案:

答案 0 :(得分:3)

您的访问令牌是否具有“用户”范围?相关的excerpt from the docs

  

通过API管理公钥要求您通过基本身份验证或具有“用户”范围的OAuth进行身份验证。

如果您的令牌具有“用户”范围,您将收到404回复,并显示“未找到”消息。

要查看与令牌关联的范围,请使用“授权”API:

curl -u <username> https://api.github.com/authorizations

在下面的示例响应中,第一个授权具有“用户”范围,但第二个授权没有。

enter code here
[
  {
    "id": 123,
    "url": "https://api.github.com/authorizations/123",
    "app": {
      "name": "Foo",
      "url": "https://foo.example.com/",
      "client_id": "REDACTED-ID-1"
    },
    "token": "REDACTED-TOKEN-1",
    "note": null,
    "note_url": null,
    "created_at": "2013-02-18T18:24:00Z",
    "updated_at": "2013-05-06T14:17:00Z",
    "scopes": [
      "repo",
      "user"
    ]
  },
  {
    "id": 456,
    "url": "https://api.github.com/authorizations/456",
    "app": {
      "name": "Bar",
      "url": "https://bar.example.com/",
      "client_id": "REDACTED-ID-2"
    },
    "token": "REDACTED-TOKEN-2",
    "note": "for stuff",
    "note_url": null,
    "created_at": "2013-04-16T12:20:00Z",
    "updated_at": "2013-05-13T21:28:00Z",
    "scopes": [
      "public_repo"
    ]
  }
]

如果您确定这是问题的根源,那么您可以通过以下两种方式解决此问题:

答案 1 :(得分:3)

截至2014年2月,“用户”范围不再提供足够的访问权限来管理用户的SSH密钥。范围必须定义为:

  • 读取:public_key - 提供对用户SSH密钥的读访问权
  • 写:public_key - 允许应用读取现有密钥并创建新密钥
  • admin:public_key - 使应用程序能够读取,写入和删除密钥