2016-05-23 56 views
2

这非常奇怪(也许不安全的行为),所以请耐心等待,因为我试图解释这一点。我已经调试了几个小时,无法弄清楚为什么Github API会以这种方式处理我的RESTful API请求。GitHub API问题 - 创建公钥

我使用Github oAuth API验证我的应用程序。当用户成功验证他们的github账户时,我根据请求的范围获得用户的access_token ...没问题,标准oAuth行为(https://developer.github.com/v3/oauth/#web-application-flow)。

然后,以后每API调用,我附上访问令牌的HTTP Authorization头,像这样:

Authorization: 'token abcdefghijklmnopqrstuvwxyz123456789abcde' 

的行动我想用的access_token执行是增加公共密钥对用户的帐户,一切似乎只是罚款:https://developer.github.com/v3/users/keys/#create-a-public-key

现在,2个用户帐户这样做时,怪事发生了。如果我有2个用户,比方说,Alice和Bob。

Alice用github登录应用程序,获得access_token'aaa',我的应用程序可以使用授权标题中的'aaa'access_token成功将公钥添加到她的帐户。

我注销应用爱丽丝和鲍勃使用的GitHub的凭据登录为鲍勃。 auth成功,Github为Bob提供了access_token'bbb'。但是,当试图将公钥添加到Bob的帐户时,即使Bob在其账户中没有任何公钥,也会得到一个“密钥已被使用”的错误。

但是,通过使用鲍勃的access_token“BBB”,用于其他API请求,比如上市私有仓库和组织,Github上返回鲍勃的数据。似乎在他的账户中创建公钥时,Github仍然将Bob的access_token'bbb'与Alice的公钥关联起来。

更奇怪的是我验证了这一点,因为一旦我从Alice的账户中删除了公钥,我就能够成功登录Bob并将公钥添加到Bob的账户,而不是Alice的公钥。

我在该国的两个独立的地理区域测试在同一浏览器这种行为,在两个不同的浏览器在同一台计算机上,并在两个不同的计算机具有相同的结果。

我假设,通过Github上提供的将的access_token就是行动要对执行用户帐户正确关联。特别是对于POST和DELETE请求,其中用户名未在URL中显示,就像大多数GET请求一样。

我敢肯定,我失去了一些东西,但如果有人能提供一些见解它会不胜感激,谢谢!

回答

1

这与令牌或API根本无关 - 它与SSH密钥相关。您不能将相同的SSH密钥添加到两个不同的GitHub帐户。那将如何工作?想象一下,您将相同的密钥添加到Alice和Bob,然后您想要使用该密钥来执行git push。并且可以说推送是针对Alice推送权限但Bob不支持的存储库。你会允许推或不推?您无法做出该决定,因为您无法确定使用哪个权限来授权呼叫 - Alice或Bob - 因为该密钥不是唯一与单个用户关联的。

SSH密钥对于用户(如果它们是用户级密钥)或存储库(如果它们是存储库级别的密钥,也就是部署密钥)必须是唯一的,所以您需要为每个用户生成一个新的SSH密钥拥有而不是将相同的一个添加到所有用户的帐户中。您从API获取的错误消息告诉您密钥已添加到其他帐户。如果您尝试通过Web UI将其添加到该帐户,您会看到相同的消息。

告诉你密钥已经被添加到另一个帐户并不真正不安全,因为这些密钥是公开密钥,而不是您要添加到GitHub的私钥。公钥是公开的,所以任何人都可以确定用户X的公钥,并尝试从X中添加公钥。然后他们会观察到您观察到的同一个错误,但这不会降低用户X的安全性,因为私钥没有被所有这些暴露。