omniauth-github
でRuby on Railsのログイン機構を作るときに何度も検索したりすることがあるので、ざっくりやりかたをまとめました。
作業リポジトリ
README
This README would normally document whatever steps are necessary to get the application up and running.
Things you may want to cover:
-
Ruby version
-
System dependencies
-
Configuration
-
Database creation
-
Database initialization
-
How to run the test suite
-
Services (job queues, cache servers, search engines, etc.)
-
Deployment instructions
-
...
環境
- Ruby: 2.6.5
- Rails: 6.0.2.2
- omniauth-github: 1.4.0
使用したGem
omniauth / omniauth-github
GitHub strategy for OmniAuth
OmniAuth GitHub
This is the official OmniAuth strategy for authenticating to GitHub. To use it, you'll need to sign up for an OAuth2 Application ID and Secret on the GitHub Applications Page.
Installation
gem 'omniauth-github', github: 'omniauth/omniauth-github', branch: 'master'
Basic Usage
use OmniAuth::Builder do provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'] end
Basic Usage Rails
In config/initializers/github.rb
Rails.application.config.middleware.use OmniAuth::Builder do provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'] end
Github Enterprise Usage
provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'], { :client_options => { :site => 'https://github.YOURDOMAIN.com/api/v3', :authorize_url => 'https://github.YOURDOMAIN.com/login/oauth/authorize', :token_url => 'https://github.YOURDOMAIN.com/login/oauth/access_token', } }
Scopes
GitHub API v3 lets you set scopes to provide granular access to different types of data:
use OmniAuth::Builder
…ざっくり手順
Gemfile
に書き加える
gem 'omniauth-github'
bundle installする
GitHub Applicationを作る
https://github.com/settings/apps
上記リンクにアクセスして新規で作成する。
ざっくり編集する
開発用で設定するときは Homepage URLを http://localhost:3000
、User authorization callback URLを http://localhost:3000/auth/github/callback
にする。
Permissionの設定はユーザ登録だけであれば、User permissions
のEmail AddressesをRead-onlyにする
作成し終えたら Client IDとClient secretを控える
環境変数にセットする
EDITOR="vim" bin/rails credentials:edit
github_omniauth: client_id: hoge client_secret: hogehoge
yaml形式で設定する。実際に反映されるているか確認するときは、 rails console
を使用する
$ rails c Loading development environment (Rails 6.0.2.2) irb(main):001:0> Rails.application.credentials.github_omniauth => {:client_id=>"hoge", :client_secret=>"hogehoge"}
Userモデルを作る
rails g model user name:string provider:string uid:text oauth_token:string rails db:create rails db:migrate
# app/models/user.rb class User < ApplicationRecord def self.find_or_create_with_omniauth!(auth) user = find_by(uid: auth['uid']) return user if user.present? create! do |user| user.provider = auth['provider'] user.uid = auth['uid'] user.name = auth['info']['nickname'] user.oauth_token = auth['credentials']['token'] end end end
Routingを設定する
# config/routes.rb Rails.application.routes.draw do get 'auth/github/callback', to: 'sessions#callback' get '/sign_out', to: 'sessions#destroy' root 'homes#top' end
SessionsControllerを作る
rails g controller sessions
# app/controllers/sessions_controller.rb class SessionsController < ApplicationController def callback user = User.find_or_create_with_omniauth!(request.env['omniauth.auth']) session[:user_id] = user.id redirect_to root_path end def destroy reset_session # セッションをリセットする redirect_to root_path end end
HelperMethodを作る
# app/controllers/application_controller.rb class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :current_user, :logged_in? private def current_user return unless session[:user_id] @current_user ||= User.find(session[:user_id]) end def logged_in? !!session[:user_id] end def authenticate return if logged_in? redirect_to root_path, alert: 'ログインしてください' end end
Viewを作る
<%# app/views/homes/top.html.erb %> <% if logged_in? %> <%= link_to 'Sign out', '/sign_out' %> <ul> <li>ID: <%= current_user.id %></li> <li>NAME: <%= current_user.name %></li> <li>PROVIDER: <%= current_user.provider %></li> </ul> <% else %> <%= link_to 'Githubアカウントでサインイン', '/auth/github' %> <% end %>
Omniauthの設定ファイルを作成する
touch config/initializers/omniauth.rb
# config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :developer unless Rails.env.production? provider :github, Rails.application.credentials.github_omniauth[:client_id], Rails.application.credentials.github_omniauth[:client_secret], scope: "user" end
実際に確認する
rails s
サインイン前
サインイン後
テストコード
途中
https://github.com/omniauth/omniauth/wiki/Integration-Testing
これを参考にすすめると良さそう
Top comments (0)