Это четвертая часть моей серии о Ruby Social Gems. Сегодня я сосредоточился на жемчужине Octokit для Github.
В предыдущих частях этой серии мы рассмотрели такие социальные сети, как LinkedIn и Facebook, создав простое приложение, которое покрывает запросы аутентификации и API. Мы собираемся создать аналогичное приложение с самоцветом Octokit для тех же целей.
Настройка проекта
Мы будем использовать rails-composer для быстрой настройки проекта с необходимыми гемами и конфигурацией.
Если вы не знаете rails-composer, это просто пара шаблонов проектов Rails, которые вы можете создать в интерактивном режиме при запуске проекта.
Инициализация проекта
Вы можете скачать полный исходный код этого урока с Github здесь
Запустите следующую строку, чтобы создать проект:
rails new rsg_github_gem -m https://raw.github.com/RailsApps/rails-composer/master/composer.rb
Вам будет задано несколько вопросов от композитора о шаблоне проекта. Вы можете выбирать между различными вариантами, как вам нравится. Я перечислю важные параметры, которые я выбрал для создания этого проекта:
- Создайте пример приложения RailsApps
- Рельсы-OmniAuth
- Еврорадио
- GitHub
После создания проекта создайте приложение на Github, чтобы получить Client ID
Client Secret
. Эти значения secrets.yml
файле secrets.yml
в вашем приложении Rails. Не беспокойтесь об этом сейчас, мы вернемся к этому шагу позже.
Создать приложение Github
Перейдите к (ваши настройки Github) [https://github.com/settings/applications] и нажмите кнопку « Зарегистрировать новое приложение» , затем заполните форму. Единственное значение, которое имеет значение для наших целей, — это поле «URL обратного вызова авторизации», которое вы должны заполнить точным обратным вызовом, определенным в ваших маршрутах.
rails-composer создал этот маршрут как http://localhost:3000/auth/github/callback
.
Просматривая файл rsg github gem / config / rout.rb в строке 4, вы увидите get '/auth/:provider/callback' => 'sessions#create'
. Это наш callback.r :provider
здесь :provider
github
потому что мы используем гем OmniAuth для аутентификации.
Если вы не знакомы с OmniAuth, вот цитата из их репозитория Github:
OmniAuth — это библиотека, которая стандартизирует многопрофильную аутентификацию для веб-приложений. Он был создан, чтобы быть мощным, гибким и делать как можно меньше. Любой разработчик может создать стратегии для OmniAuth, которые могут аутентифицировать пользователей через разрозненные системы. Стратегии OmniAuth были созданы для всего, от Facebook до LDAP.
Мы подробно расскажем об OmniAuth в следующем уроке.
Ключ и секрет провайдера OmniAuth
После того как вы создали приложение в Github, скопируйте «Идентификатор клиента» в omniauth_provider_key
и «Client Secret» в omniauth_provider_secret
в rsg github gem / config / secrets.yml .
Перезапустите сервер Rails и зайдите (http: // localhost: 3000 / signin) [http: // localhost: 3000 / signin]. Вы должны быть перенаправлены на страницу авторизации Github для авторизации вашего приложения.
Boom! Мы только что осуществили вход в систему с помощью Github, цель этого руководства.
Теперь мы представим Github API, драгоценный камень Octokit, а затем углубимся в создание демонстрационного проекта.
Введение в Github API
Github предоставляет очень богатый набор API-интерфейсов, которые позволяют разработчикам получать доступ к большинству (если не ко всем) данным Github. Он предоставляет набор веб-хуков, которые дают вам возможность создавать очень интересные приложения.
Вы можете получить доступ к API Github без аутентификации, но вы будете ограничены количеством запросов в час. Вот цитата из ссылки на Github об ограничениях:
Для запросов, использующих обычную аутентификацию или OAuth, вы можете делать до 5000 запросов в час. Для неаутентифицированных запросов ограничение скорости позволяет делать до 60 запросов в час.
В справочнике по API вы можете увидеть все различные области, от API-интерфейсов Activity до Enterprise-API. Мы сосредоточимся на двух разделах: пользователи и репозитории
Octokit.rb Gem
OmniAuth предназначен только для аутентификации пользователей с помощью их учетных записей Github. Мы будем использовать гем Octokit для прагматического доступа к API. Вот цитата из их репозитория Github :
Octokit.rb оборачивает GitHub API в плоский API-клиент, который следует соглашениям Ruby и не требует больших знаний о REST. Большинство методов имеют позиционные аргументы для обязательного ввода и хэш опций для необязательных параметров, заголовков или других опций
Давайте начнем строить часть запросов API демо-проекта с помощью гема Octokit.
Добавьте гем в гем Gemfile gem "octokit", "~> 3.0"
и запустите bundle install
.
Создание демо-проекта
Прежде чем мы начнем писать какой-либо код, давайте рассмотрим сгенерированный код внутри session_controller
, модель user
и маршруты.
Маршруты
Давайте сосредоточимся на двух маршрутах. Первый маршрут используется в качестве обратного вызова, упомянутого выше, который вы должны добавить в приложение Github.
get '/auth/:provider/callback' => 'sessions#create'
Другим маршрутом является маршрут отказа, на который Github перенаправляет пользователя, если пользователь отказался авторизовать приложение или произошла какая-либо другая ошибка авторизации.
get '/auth/failure' => 'sessions#failure'
Модель пользователя
Мы внесли некоторые изменения в пользовательскую модель, так что это не просто сгенерированный код. Следующий код создает нового пользователя с provider
, uid
и name
. Как только пользователь создан, мы добавляем объект GithubProfile
с базовой информацией и access_token
для последующего использования для доступа к Github.
def self.create_with_omniauth(auth) new_user = create! do |user| user.provider = auth['provider'] user.uid = auth['uid'] if auth['info'] user.name = auth['info']['name'] || "" end end new_user.create_github_profile auth new_user end
Мы создадим модель GithubProfile
позже, все, что нам нужно сделать сейчас, это создать объект из этой модели и присоединить его к текущему пользователю.
def create_github_profile auth GithubProfile.create({user_id: id, nickname: auth[:info][:nickname]||"", email: auth[:info][:email]||"", name: auth[:info][:name]||"", image: auth[:info][:image]||"", location: auth[:extra][:raw_info][:location]||"", public_repo: auth[:extra][:raw_info][:public_repos]||"", public_gists: auth[:extra][:raw_info][:public_gists]||"", followers: auth[:extra][:raw_info][:followers]||"", following: auth[:extra][:raw_info][:following]||"", member_since: auth[:extra][:raw_info][:created_at]||"", access_token: auth[:credentials][:token]}) end
Github Профиль Модель
Эта модель содержит основную информацию о каждом профиле пользователя Github, а также их токен доступа к API.
rails g model github_profile user_id:integer nickname:string email:string name:string image:string location:string public_repo:integer public_gists:integer followers:integer following:integer member_since:string access_token:string
Добавьте has_one :github_profile
в модель User
чтобы связать каждый профиль с этим пользователем.
Контроллер сессий
new
действие направляет пользователей по заранее определенному маршруту с помощью OmniAuth /auth/github
. OmniAuth перенаправляет пользователя Github с правильными параметрами и URL. Вы можете /signin
это действие с /signin
маршрута /signin
.
def new redirect_to '/auth/github' end
Действие create
является стандартным во всех стратегиях OmniAuth. Он извлекает имя провайдера (в данном случае github
) и уникальный идентификатор пользователя этого провайдера. Если не было пользователей с этими параметрами, он создаст нового пользователя с create_with_omniauth
метода create_with_omniauth
в модели User
.
def create auth = request.env["omniauth.auth"] user = User.where(:provider => auth['provider'], :uid => auth['uid'].to_s).first || User.create_with_omniauth(auth) reset_session session[:user_id] = user.id redirect_to root_url, :notice => 'Signed in!' end
Github Controller
Этот контроллер отображает текущих пользовательских репо.
rails g controller github index
Здесь мы будем использовать самый простой запрос для демонстрационного проекта, который собирает список всех общедоступных репозиториев для текущего пользователя.
Сначала GithubProfile
аутентификацию клиента с помощью токена доступа, хранящегося в модели GithubProfile
. После этого просто запросите пользовательские репозитории с помощью client.repos
.
def index client = Octokit::Client.new(:access_token => current_user.github_profile.access_token) @repositories = client.repos end
Взгляды
Подготовьте существующие представления, чтобы показать кнопки «вход» и «выход», а также отобразить основную информацию, имеющуюся у нас о текущем пользователе.
Заявив с помощью ссылки links.html.erb , добавьте ссылки на выход из системы, вход в систему, профиль пользователя Github.
<li> <%= link_to 'rsg_github_gem', root_path, class: 'navbar-brand' %> </li> <% unless current_user %> <li> <%= link_to "Sign in with Github", "/signin" %> </li> <% else %> <li> <%= link_to "Github Profile", "/github" %> </li> <li> <%= link_to "Sign out", "/signout" %> </li> <% end %>
Мы отобразим основную информацию о вошедшем в систему пользователе в users / index.html.erb .
<% if current_user %> <div><h3>Welcome, <%= current_user.name %></h3></div> <img src="<%= current_user.github_profile.image %>" width="100px" style="float: left; margin-right: 12px;"> <div style="margin-left: 120px;"> <h4>From: <%= current_user.github_profile.location %></h4> <h4>Public Repos: <%= current_user.github_profile.public_repo %></h4> <h4>Public Gists: <%= current_user.github_profile.public_gists %></h4> <h4>Followers: <%= current_user.github_profile.followers %></h4> <h4>Following: <%= current_user.github_profile.following %></h4> <h4>Member Since: <%= Date.parse current_user.github_profile.member_since %></h4> </div> <% else %> <h1>Welcome, please login.</h1> <% end %>
Последнее представление, которое мы собираемся написать, — это github / index.html.erb, который отображает основную информацию для общедоступных репозиториев текущего пользователя.
<h1>Public Repositories</h1> <ul style="list-style-type: none;"> <% @repositories.each do |repo| %> <li> <p><b><%= repo[:name].capitalize %></b>: <i><%= repo[:description].capitalize %></i> <b>[Watchers: <%= repo[:watchers] %>, Forks: <%= repo[:forks]%>, Stargazers: <%= repo[:stargazers_count] %>]</b></p> </li> <% end %> </ul>
Это выглядит так:
Области применения
Последний пункт, связанный с доступом к Github API — это Scopes, который определяет, что вы можете или не можете получить из пользовательских данных. Вы можете настроить области действия в конфигурации OmniAuth в rsg github gem / config / initializers / omniauth.rb следующим образом:
Rails.application.config.middleware.use OmniAuth::Builder do provider :github, Rails.application.secrets.omniauth_provider_key, Rails.application.secrets.omniauth_provider_secret, scope: "user,repo,gist" end
Завершение
Я надеюсь, что это руководство было полезным и хорошим введением в использование гемов Octokit и API Github. Если вы хотите предложить следующий драгоценный камень для освещения, сделайте это в комментариях. Спасибо за прочтение!