Rails5.1에서 Github 로그인

11240 단어 GitHubRubyRails

0. 시작


처음 뵙겠습니다!!
저는 toramaruJP입니다.ω·´)
어제 오리지널 앱을 만들었어요!!
평소에 Qiita씨의 보살핌을 받아 조금이나마 공헌을 하고 싶습니다. 저는 오리지널 응용 프로그램에서 가져온 Github 로그인 실현 방법을 기록하고 싶습니다.
개선점이 있을 때, 지적할 수 있다면 나는 매우 기쁠 것이다.

1. 구현 개요


(1) Github 협업 준비!(Github)
(2) Github 콜라보레이션 준비!(설치)
(3) Devise를 사용하여 Github 로그인!

2. 구현 세부 정보


(1) Github 협업 준비!(Github)



먼저 위 이미지의 오른쪽 위 모서리에 있는 설정 탭을 누릅니다.

그리고 왼쪽 아래에 있는 Developer settings 탭을 누릅니다.

이렇게 하면 위 이미지와 같은 화면이 되므로 오른쪽에 있는'New OAuth 앱'을 누릅니다.

그림과 같이 Local에서 이동할 때
응용 프로그램 이름에는 응용 프로그램 이름이 포함됩니다.
· "Homepage URL"에 "http://localhost:3000/"
・"Authorization callback URL"에 "http://localhost:3000/users/auth/github/callback"
에서 설명한 대로 해당 매개변수의 값을 수정합니다.
마지막으로 "응용 프로그램 등록"단추를 누르면 완성됩니다.
그러면 클라이언트 ID 및 클라이언트 보안이 생성됩니다.
이따가 쓸 거니까 적어두세요.
※'Client ID'와'Client Secret'은 생성된 프로그램 이름을 클릭한 후 자세한 내용에 기재되어 있으므로 여기서 확인할 수 있습니다.

(2) Github 콜라보레이션 준비!(설치)


(a) 응용 프로그램 시작!


개발에 사용된 버전은 다음과 같다.
Rails v5.1.6
ruby v2.3.1
다음 명령을 사용하여 현재 버전을 확인할 수 있습니다.
$ ruby -v
$ rails -v
rails new 명령을 사용하여 프로그램을 시작합니다.
$ rails _5.1.6_ new oauth -d postgresql
다음 명령을 실행하면 "http://localhost:3000/"
사용자 정의 모양새를 정의합니다.
$ rails s

(b) OAuth 인증 설치에 필요한 Gem!


Gemfile에 다음 내용을 추가한 다음 "bundle install"을 진행하십시오.
Gemfile
省略

gem 'devise'
gem 'omniauth'
gem 'omniauth-github'

省略
$ bundle install
읽기 전용 스토리지
・devise-https://github.com/plataformatec/devise
・omniauth-https://github.com/omniauth/omniauth
・omniauth-github-https://github.com/omniauth/omniauth-github

(c) Devise 설정!


다음 명령을 입력하여devise에 필요한 설정 파일을 만듭니다.
$ rails g devise:install
이렇게, 준비됐습니다.

(3) Devise를 사용하여 Github 로그인!


(a) 사용자 테이블 만들기!

$ rails g devise user
다음과 같이 만든 마이그레이션 파일을 편집합니다.
class DeviseCreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,               null: false, default: ""
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :provider, null: false, default: ""
      t.string :uid, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.inet     :current_sign_in_ip
      # t.inet     :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :name,                 unique: true
    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    add_index :users, [:uid, :provider], unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end
마이그레이션 파일을 편집할 수 있는 경우
다음 명령을 실행하여 테이블을 만듭니다.
$ rails db:migrate

(b) users/registration_컨트롤러를 만들고 devise 컨트롤러를 계승합니다!


다음 명령을 실행합니다.
$ rails g controller users::registrations
만든 파일을 편집하려면:.
app/controllers/users/registrations_controller
class Users::RegistrationsController < Devise::RegistrationsController
  def build_resource(hash={})
    hash[:uid] = User.create_unique_string
    super
  end
end
※ 상기 "build_resource(hash={})"방법은 상속 원본을 덮어씁니다.구체적으로 말하면 uid에 무작위 값을 대입합니다.
아래에서 상속원을 확인할 수 있는 이 방법.
https://github.com/plataformatec/devise/blob/bcdd54cc5ebd3413eeb3d17e3b634e8ace0d09f3/app/controllers/devise/registrations_controller.rb

(c) create_unique_string 방법을 만들어라!


다음 파일에 다음 방법을 추가합니다.
app/models/user.rb
  def self.create_unique_string
    SecureRandom.uuid
  end

(d) 라우팅 추가!


config/routes.rb
  devise_for :users, controllers: {
    registrations: "users/registrations"
  }

(e) 모델 편집!


다음 파일을 편집하려면 다음과 같이 하십시오.
app/models/user.rb
  devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable,
       :omniauthable, omniauth_providers: %i(github)
다음 파일에 다음 방법을 추가합니다.
app/models/user.rb
  def self.find_for_github_oauth(auth, signed_in_resource=nil)
    user = User.find_by(provider: auth.provider, uid: auth.uid)

    unless user
      user = User.new(provider: auth.provider,
                      uid:      auth.uid,
                      name:     auth.info.name,
                      email:    User.dummy_email(auth),
                      password: Devise.friendly_token[0, 20]
      )
    end
    user.save
    user
  end
app/models/user.rb
  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end
현재의 상응하는 모델은 다음과 같다.
app/models/user.rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :omniauthable, :confirmable, omniauth_providers: %i(google facebook github)

  def self.create_unique_string
    SecureRandom.uuid
  end

  def self.find_for_github_oauth(auth, signed_in_resource=nil)
    user = User.find_by(provider: auth.provider, uid: auth.uid)

    unless user
      user = User.new(provider: auth.provider,
                      uid:      auth.uid,
                      name:     auth.info.name,
                      email:    User.dummy_email(auth),
                      password: Devise.friendly_token[0, 20]
      )
    end
    user.save
    user
  end

  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end

(f) github를 통해 받은 OAuth 인증을 읽는 데 필요한 값을 설정합니다("Client ID" 와 "Client Secret")!


다음 파일에 다음 설명을 추가하십시오.
config/initializers/devise.rb
Devise.setup do |config|

  省略

  config.omniauth :github, ENV["GITHUB_ID"], ENV["GITHUB_SECRET"], scope: 'user,public_repo'

  省略

end

(g) .env 파일 만들기!


응용 프로그램 디렉터리 바로 아래에 다음 파일을 만들고 다음 설명을 추가하십시오.
.env
  GITHUB_ID=メモした"Client ID"
  GITHUB_SECRET=メモした"Client Secret"
안전을 고려하여github로 전송하지 않기 위해 다음 파일에 다음 설명을 추가하십시오.
.gitignore
  .env
.env에 기록된 환경 변수를 식별하기 위해 "dotenv"라는 gem를 설치하십시오.
Gemfile
  gem 'dotenv-rails'
 $ bundle install

(h) 로그인 버튼 링크를 설정하는 View 만들기!


터미널에서 다음 명령을 실행합니다.
 $ rails g controller oauth_test index
생성된 보기 파일에서 로그인 단추 링크를 설정합니다.
app/views/oauth_test/index.html.erb
 <p><%= notice %><%= alert %></p>
 <% if user_signed_in? %>
   <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
 <% else %>
   <%= link_to 'githubでサインアップしてね', user_github_omniauth_authorize_path %>
 <% end %>
라우트를 재설정합니다.
config/routes.rb
  devise_for :users, controllers: {
    registrations: "users/registrations",
    omniauth_callbacks: "users/omniauth_callbacks"
  }

(i) 리셋 처리 컨트롤러 만들기!


아래의 디렉터리에서 아래의 파일을 작성하여 아래의 내용을 기술하십시오.
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def github
    @user = User.find_for_github_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication
      set_flash_message(:notice, :success, :kind => "Github") if is_navigational_format?
    else
      session["devise.github_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

(j) 리셋 목적지의 루트 선택을 설정합니다!


다음 파일에 다음 설명을 추가합니다.
config/routes.rb
 root :to => 'oauth_test#index'

(k) 섬광 정보 표시!


다음 파일에 다음 설명을 추가합니다.
app/views/layouts/application.html.erb

 省略

 <body>
   <% if notice %>
     <p class="alert alert-notice"><%= notice %></p>
   <% end %>
   <% if alert %>
     <p class="alert alert-error"><%= alert %></p>
   <% end %>

   <%= yield %>

省略
이상은!!!!!
이러면 "github에 사인"링크를 클릭하면 github 로그인 인증!!!!
하면, 만약, 만약...д)(゜д)
질문 좀 알려주시면 좋을 것 같아요.ω·´)

3. 마지막


처음 쓰는 건데 고생이 많네요.д)
쓰고 정리하는 게 힘들어요.д)
많이 쓴 사람 대단하다.д)
다만, 자신에게도 이롭기 때문에 앞으로도 계속 쓰자!!
끝까지 봐주셔서 감사합니다!!

좋은 웹페이지 즐겨찾기