GitHub Enterprise APIに対して認証済みのリクエストを行う際には、カレントユーザのリポジトリやOrganizationをフェッチする必要がある場合もあります。 このガイドでは、これらのリソースを確実に調べる方法について説明します。
GitHub Enterprise APIとやり取りを行うため、ここではOctokit.rbを使用します。 このプロジェクトの完全なソースコードは、platform-samplesリポジトリにあります。
はじめましょう
まだ「認証の基本」ガイドを読んでいない場合は、それを読んでから以下の例に取り組んでください。 以下の例は、OAuthアプリケーションを登録済みで、アプリケーションがユーザのOAuthトークンを持っていることを前提としています。
アプリケーションでアクセス可能なユーザのリポジトリを調べる
ユーザは、個人でリポジトリを所有する他に、別のユーザやOrganizationが所有するリポジトリのコラボレータであることもあります。 ユーザがアクセス権限を持つリポジトリには、ユーザが読み込みや書き込みアクセスを持つプライベートリポジトリと、ユーザが書き込みアクセスを持つパブリックリポジトリがあります。
アプリがユーザのどのリポジトリにアクセスできるかを決めるのは、OAuthスコープおよびOrganizationのアプリケーションポリシーです。 以下のワークフローを使用して、これらのリポジトリを調べます。
いつものように、まずはGitHubのOctokit.rb Rubyライブラリを読み込む必要があります。 そしてOctokit.rbがページネーションを自動的に処理してくれるよう設定します。
require 'octokit'
Octokit.auto_paginate = true
次に、アプリケーションのユーザに対するOAuthトークンを渡します。
# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below.
client = Octokit::Client.new :access_token => ENV["OAUTH_ACCESS_TOKEN"]
これで、アクセス可能なユーザのリポジトリをフェッチする準備が整いました。
client.repositories.each do |repository|
full_name = repository[:full_name]
has_push_access = repository[:permissions][:push]
access_type = if has_push_access
"write"
else
"read-only"
end
puts "User has #{access_type} access to #{full_name}."
end
アプリケーションがアクセス可能なユーザのOrganizationを調べる
アプリケーションは、ユーザに対してOrganizationに関するあらゆるタスクを実行できます。 アプリケーションがタスクを実行するには、必要な権限を持つOAuth認証 が必要です。 たとえば、read:org
スコープではTeamのリストを取得でき、user
スコープではユーザのOrganizationに属するメンバーを取得できます。 ユーザがこれらのスコープのうちの1つ以上をアプリケーションに付与すると、ユーザのOrganizationをフェッチする準備が整います。
上記でリポジトリを調べたときと同様に、まずはGitHubのOctokit.rb Rubyライブラリを呼び出し、ページネーションを扱えるようにしましょう。
require 'octokit'
Octokit.auto_paginate = true
次に、アプリケーションのユーザに対するOAuthトークンを渡して、APIクライアントを初期化します。
# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below.
client = Octokit::Client.new :access_token => ENV["OAUTH_ACCESS_TOKEN"]
これで、アプリケーションがアクセス可能なユーザのOrganizationを取得できます。
client.organizations.each do |organization|
puts "User belongs to the #{organization[:login]} organization."
end
パブリックなOrganizationに依存しない
このドキュメントを端から端まで読んだ方は、ユーザのパブリックなOrganizationに属するメンバーを取得するAPIメソッドに気付いたかもしれません。 ほとんどのアプリケーションでは、このAPIメソッドを避けるべきです。 このメソッドは、ユーザのパブリックなOrganizationに属するメンバーだけを返し、プライベートなOrganizationに属するメンバーは返しません。
通常、アプリケーションでは、アプリケーションにアクセスする権限が与えられたユーザのOrganization (パブリックおよびプライベート) の全てを必要とします。 上記のワークフローでは、まさにこれを実行しています。