这是非常奇怪的(也许是不安全的行为)所以请在我试着解释这个时请耐心等待。我已经调试了好几个小时了,无法弄清楚为什么Github API以这种方式对我的RESTful 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。
我以Alice身份退出应用程序并使用Bob的github凭据以Bob身份登录。身份验证成功,Github为Bob提供了access_token' bbb'。但是,当尝试将公钥添加到Bob的帐户时,我得到一个"密钥已经在使用"错误,即使Bob在他的帐户中没有任何公钥。
然而,通过使用Bob的access_token' bbb'对于其他API请求,例如列出私有存储库和组织,Github返回Bob的数据。似乎在他的帐户中创建公钥时,Github仍在关联Bob的access_token' bbb'用Alice的公钥。
更奇怪的是,我已经验证了这一点,因为一旦我从Alice的帐户中删除了公钥,我就能够成功登录Bob并将公钥添加到Bob's帐户,而不是爱丽丝的!
我在同一个浏览器中测试了这种行为,在同一台计算机上的两个不同的浏览器中以及该国家的两个不同地理区域的两台不同的计算机上测试了这种行为。
我假设Github提供的access_token将正确关联要执行操作的用户帐户。特别是对于POST和DELETE请求,其中URL中未指示用户名,就像大多数GET请求一样。
我确定我错过了一些东西,但如果有人能提供一些见解,我们将非常感激,谢谢!
答案 0 :(得分:1)
这与令牌或API完全无关 - 它与SSH密钥有关。您不能将相同的SSH密钥添加到两个不同的GitHub帐户。怎么会这样呢?想象一下,您将相同的密钥添加到Alice和Bob,然后您想使用该密钥执行 EditText edt = (EditText) findViewById(R.id.edittext);
String abc = edt.getText().toString();
if (abc.matches("")) {
Toast.makeText(this, "enter something", Toast.LENGTH_SHORT).show();
login_image.setVisibility(View.INVISIBLE);
return;
}
else
{
login_image.setVisibility(View.VISIBLE);
}
。并且假设推送针对的是Alice拥有推送权限的存储库,但Bob没有。你是否允许推动?您无法做出该决定,因为您无法确定用于授权呼叫的权限 - Alice或Bob's - 因为该密钥与单个用户没有唯一关联。
SSH密钥对于用户(如果是用户级密钥)或存储库(如果它们是存储库级密钥,即部署密钥)需要是唯一的,因此您需要为每个用户生成一个新的SSH密钥而不是将同一个添加到您的所有用户的帐户。您从API返回的错误消息告诉您该密钥已添加到其他帐户。如果您尝试通过Web UI将其添加到该帐户,则会看到相同的消息。
告诉你密钥已经被添加到另一个帐户并不是真的不安全,因为那些是 public 密钥,而不是你要添加到GitHub的私钥。公钥是公共的,因此任何人都可以确定用户X的公钥是什么,并尝试从X添加公钥。然后他们会观察到您观察到的相同错误,但这不会降低用户X的安全性,因为所有这些都没有公开私钥。