GitHub APIに対して認証済みのリクエストを行う際には、現在のユーザーのリポジトリや organization をフェッチする必要がある場合もあります。 このガイドでは、これらのリソースを確実に調べる方法について説明します。
GitHub API を操作するには、Octokit.rb を使います。 このプロジェクトの完全なソース コードは、platform-samples リポジトリにあります。
始めに
まだ「認証の基本」を読んでいない場合は、読んでから以下の例に取り組んでください。 以下の例は、OAuth app を登録してあり、アプリケーションにユーザー用の OAuth トークンがあることを前提としています。
アプリケーションでアクセス可能なユーザのリポジトリを調べる
ユーザは、個人でリポジトリを所有する他に、別のユーザやOrganizationが所有するリポジトリのコラボレータであることもあります。 全体的にこれらは、ユーザーが特権アクセスを行なえるリポジトリです。ユーザーが読み取りあるいは書き込みのアクセス権を持つプライベートリポジトリであったり、ユーザーが書き込みのアクセス権を持つパブリックもしくは内部のリポジトリであったりします。
[OAuth スコープ](/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps)と [Organization のアプリケーション ポリシー](https://developer.github.com/changes/2015-01-19-an-integrators-guide-to-organization-application-policies/)によって、アプリでユーザーに対してアクセスできるリポジトリが決まります。 以下のワークフローを使用して、これらのリポジトリを調べます。
いつものように、最初にGitHubの Octokit.rb Ruby ライブラリが必要になります。 そして、ページネーションを自動的に処理するように Octokit.rb を構成します。 ページネーションの詳細については、「REST API でのページネーションの使用」を参照してください。
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に関するあらゆるタスクを実行できます。 これらのタスクを実行するには、アプリに十分な権限を持つ OAuth 承認が必要です。 たとえば、read:org スコープを使うとチームの一覧を表示することができ、user スコープではユーザーの Organization メンバーシップを公開することができます。 ユーザーがこれらのスコープのうち一つ以上をアプリケーションに許可すると、ユーザーの組織を取得する準備ができます。
上記のリポジトリを検出したときと同様に、まずGitHubの Octokit.rb Ruby ライブラリを要求し、改ページ位置の処理を行う構成を行います。 ページネーションの詳細については、「REST API でのページネーションの使用」を参照してください。
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に属するメンバーは返しません。
アプリケーションでは通常、アプリがアクセスを認可されているすべてのユーザーの組織を取得したいと考えます。 上記のワークフローでは、まさにこれを実行しています。