如何通过 GitHub 的 v3 API 添加 ssh 密钥?

kjo*_*kjo 4 github github-api

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

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

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

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"
Run Code Online (Sandbox Code Playgroud)

当我运行上面的程序时,我得到的响应是:

{
  "message": "Not Found"
}
Run Code Online (Sandbox Code Playgroud)

...而且,果然,当我签入我的 GitHub 帐户时,$KEY不在列出的 ssh-keys 1 中

 

 

我究竟做错了什么?

 

 

额外细节

"message": "Not Found"如果我只是运行,我会得到相同的响应

curl -s "https://api.github.com/user/keys?access_token=$TOKEN"
Run Code Online (Sandbox Code Playgroud)

如果我-s-i我看到的替换上面的内容,实际上,返回的状态是404 Not Found. 然而,返回的状态

curl -i "https://api.github.com/user/keys"
Run Code Online (Sandbox Code Playgroud)

401 Unauthorized


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

curl -s "https://api.github.com/user/repos?access_token=$TOKEN"
Run Code Online (Sandbox Code Playgroud)

返回正确的信息,以及

curl -s "https://api.github.com/user/repos"
Run Code Online (Sandbox Code Playgroud)

返回

{
  "message": "Requires authentication"
}
Run Code Online (Sandbox Code Playgroud)

jas*_*lph 8

您的访问令牌是否具有“用户”范围?文档的相关摘录摘录:

\n\n
\n

通过 API 管理公钥要求您通过基本身份验证或具有 \xe2\x80\x98user\xe2\x80\x99 范围的 OAuth 进行身份验证。

\n
\n\n

如果您的令牌没有用户”范围,您将收到带有“未找到”消息的 404 响应。

\n\n

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

\n\n
curl -u <username> https://api.github.com/authorizations\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

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

如果您确定这是问题的根源,则可以通过以下两种方法之一解决它:

\n\n\n


小智 5

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

  • read:public_key - 提供对用户 SSH 密钥的读取访问权限
  • write:public_key - 允许应用读取现有密钥并创建新密钥
  • admin:public_key - 允许应用读取、写入和删除密钥