2016-05-23 63 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的安全性,因爲私鑰沒有被所有這些暴露。