2016-05-23 28 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 and Bob」としましょう。

アリスがgithubでアプリにログインすると、access_token 'aaa'が与えられ、私のアプリはAuthorizationヘッダーの 'aaa' access_tokenを使って自分のアカウントに公開キーを追加できます。

私はアリスとしてアプリケーションからログアウトし、Bobのgithub資格情報を使ってBobとしてログインします。認証は成功し、GithubはBobにaccess_token 'bbb'を提供します。しかし、ボブのアカウントに公開鍵を追加しようとすると、彼のアカウントに公開鍵がないにもかかわらず、「キーはすでに使用中です」というエラーが表示されます。

しかし、プライベートレポジトリや組織の一覧表示など、他のAPIリクエストにBobのaccess_token 'bbb'を使用すると、GithubはBobのデータを返します。彼のアカウントに公開鍵を作成するとき、Githubは依然としてBobのaccess_token「bbb」をAliceの公開鍵に関連付けるように見えます。

アリスのアカウントからパブリックキーを削除すると、Bobとのログインに成功し、パブリックキーをアリスのものではなくBobのアカウントに追加できるため、私はこれを確認しています。

この現象は、同じブラウザで、同じコンピュータ上の2つの異なるブラウザと、同じ結果を持つ2つの別々の地理的地域にある2つの異なるコンピュータでテストしました。

私はGithubによって提供されたaccess_tokenが、アクションが実行されるべきユーザアカウントを適切に関連付けると仮定しています。特に、ほとんどのGETリクエストのように、URLにユーザ名が示されていないPOSTおよびDELETE要求がある。

私は何かが不足していると確信していますが、誰かがある程度の洞察を提供できれば、感謝します。

答えて

1

これはトークンやAPIとはまったく関係がありません。これはSSHキーに関連しています。 2つの異なるGitHubアカウントに同じSSH鍵を追加することはできません。それはどのように働くでしょうか?同じキーをAliceとBobに追加し、そのキーを使用してgit pushを実行するとします。また、プッシュはAliceがプッシュパーミッションを持っているが、Bobはプッシュしていないリポジトリを対象としていると言うことができます。あなたはプッシュを許可するかしないか? AliceまたはBobの呼び出しを許可するために使用するアクセス許可を決定できないため、その決定はできませんでした。なぜなら、そのキーは単一のユーザーと一意に関連付けられていないからです。

SSH鍵はユーザ(ユーザレベルの鍵の場合)またはリポジトリ(リポジトリレベルの鍵、別名配布鍵の場合)に固有である必要があるため、ユーザごとに新しいSSH鍵を生成する必要がありますすべてのユーザーのアカウントに同じものを追加しないでください。 APIから戻ってくるエラーメッセージは、キーが既に別のアカウントに追加されていることを示しています。 Web UI経由でそのアカウントに追加しようとすると、同じメッセージが表示されます。

鍵が既に別のアカウントに追加されていることを伝えるのは、公開鍵であり、GitHubに追加する秘密鍵ではないため、実際には安全ではありません。公開鍵は公開されているので、誰でも公開鍵がXユーザであるかどうかを判断し、Xから公開鍵を追加しようとします。ユーザはあなたが観察したのと同じエラーを観察しますが、秘密鍵はこのすべてによって公開されません。

関連する問題