LoginSignup
22
28

More than 3 years have passed since last update.

【Rails】SNS認証の登録手順(Twitter、Facebook、google)

Last updated at Posted at 2020-08-03

Google API の登録

Google Cloud Platformにログインし、プロジェクトを作成。

今回は、「ユーザー認証」のみなので、使わないAPIは無効にしとく( 最低限の Google+ API だけ有効)。
Alt text
Alt text
OAuth 同意画面で設定後、認証情報をクリック(OAuth 同意しないと、認証情報を追加できない。同意画面にアプリ名を入力し、保存)。
Alt text
アプリケーションの種類: ウェブ アプリケーション、アプリ名を入力、承認済みのリダイレクトURI(コールバック のURI)を設定する。
(例:ローカルの場合)
http://localhost:3000/users/auth/google_oauth2/callback
http://localhost:3000/users/auth/google/callback
KeyとSecretが自動生成されるので、メモっとく。
Alt text

Facebook API の登録

Facebook developersで、ログインし、アプリを作成すると、マイアプリ(KeyとSecret)が自動生成される。
Alt text
Alt text
ローカルなら、 http://localhost:3000 でok。
Alt text
ダッシュボードに行く。
Alt text
App IDとSECRETをメモっとく。
Alt text
コールバック用のURIを追記。ローカルなら、 https://localhost:3000/users/auth/facebook/callback。
Alt text

Twitter API の登録

アカウント作成 → API登録申請 → 確認メール → 作成するアプリに関する設定

API 登録申請

Twitter Developer のアカウント作成

Twitter Developerにログイン。
Alt text
Alt text
Alt text
Alt text
携帯番号を入力して、 Next。認証コードを入力。

Alt text
Alt text
Alt text
内容を確認し、 Looks Good! 次に、利用規約に同意のチェックを入れ、 Submit Application をクリック。

完了画面が表示され、メールが届くので、 Confirm your email をクリックで完了。

Twitterの API_KEY、 API_SECRET取得

developer accountにアクセスし、アプリ名を入力(一意性)。作成された、API_KEYとAPI_SECRETをコピーしとく。

コールバックurlの設定。

・ permission: read only
・ Request email addresses from usersにチェック
・ Enable Sign in with Twitter(Twitter認証を使用するか): ONにする
・ Website URL(自分のwebサービスのURL)
・ callback urls(Twitter認証後に遷移するURL): ローカル/本番環境など、複数設定が可能。
(例)
http://localhost:3000/users/auth/twitter/callback (ルーティングの確認)
http://localhost:3000/users/omniauth_callbacks (コールバック用コントローラのURL、認証後の遷移)
・ privacy policy, terms of serviceも何でもいいので埋める。

アプリ側の設定:gemとテーブルの準備

Gemfile
gem 'omniauth-facebook'                  # Facebook認証
gem 'omniauth-twitter'                   # Twitter認証
gem 'omniauth-google-oauth2'             # Google認証
gem 'omniauth-github'                    # GitHub認証
gem 'dotenv-rails'                       # 環境変数の管理
# gem 'omniauth-rails_csrf_protection'   # 脆弱性の対策用。。入れたら認証エラー!になったので、アンインストール。

# ターミナルでインストール
% bundle install --path vendor/bundle

■ 登録ボタンをクリック → ユーザー登録完了する仕様 の場合

  • 必要なカラム(provider、uidカラム)をuserテーブルに追加。
ターミナル
% rails g migration AddOmniauthToUsers provider:string uid:string
% rails db:migrate
Userモデルomniauthのためのオプションを追加
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:twitter, :facebook, :google_oauth2]

■ 登録ボタンをクリック → SMS認証 → 名前、メールアドレス自動入力 + PW入力欄が非表示(入力省略) → それ以外の情報を入力し、ユーザー登録完了 の場合

  • SNS認証とユーザー登録のタイミングが異なる仕様の場合、SNS認証時は、Usersテーブルのレコードを作成しないので、別テーブル管理が良い。
  • SNS認証時の情報保存用にSnsモデルを作成(uid、providerカラム)。Userモデルとアソシエーションで、外部キーとしてuser_idを追加。
ターミナル
% rails g model sns provider:string uid:string user:references
% rails db:migrate
userモデルにomniauthのためのオプション、アソシエーションを追加
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:twitter, :facebook, :google_oauth2]

has_many :sns
snsモデルにも、アソシエーション
belongs_to :user, optional: true    # 外部キー(user_id)のnilを許可
# 初めて、SNS認証でユーザー登録する時は、まだuser_idは存在しないため、ユーザー情報が見つからないと言われる(エラー)

公開しない情報をpushしないにように設定する

  • API_KEYとAPI_SECRET を環境変数にする(gem(dotenv-rails))。
  • .env ファイルを「Gemfile」と同じ階層に手動で作成し、.gitignoreに追加する。
.gitignore
/.env
  • .env ファイルに、上でメモったKeyを環境変数に設定。
.env
TWITTER_API_KEY = 'API key を記述'
TWITTER_API_SECRET = 'API secret key を記述'

FACEBOOK_KEY = 'API key を記述'
FACEBOOK_SECRET = 'API secret key を記述'

GOOGLE_CLIENT_ID = 'API key を記述'
GOOGLE_CLIENT_SECRET = 'API secret key を記述'

$ vim ~/.bash_profile で設定してもok(変更後に、 $ source ~/.bash_profile を実行を忘れずに )!!
export : 環境変数設定のコマンド
.bash_profile : ログイン時に読まれる設定ファイル。

~/.bash_profile
# i (挿入モード)で編集
# = の前後に空白を入れるとエラーになるので注意!!
export TWITTER_CLIENT_ID='API key を記述'
export TWITTER_CLIENT_SECRET='API secret key を記述'

export FACEBOOK_CLIENT_ID='API key を記述'
export FACEBOOK_CLIENT_SECRET='API secret key を記述'

export GOOGLE_CLIENT_ID='API key を記述'
export GOOGLE_CLIENT_SECRET='API secret key を記述'
# escキーで編集終了し、:wq (保存して終了)。
  • 環境変数を使って、omniauth用を設定。
config/initializers/devise.rb
  config.omniauth :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
  config.omniauth :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET']
  config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']

ルーティングの設定

  • 今回は、deviseが提供するアクションの内容をカスタマイズしたいので、deviseクラスを継承するコントローラーが生成し、アクションをオーバーライドする(controllers/usersにdeviseクラスを継承)。そのため、ルーティング変更。
    • SNS認証でのユーザー登録時だけ、PW入力を不要にしたい。
routes.rb
devise_for :users, controllers: {
  omniauth_callbacks: 'users/omniauth_callbacks',
  registrations: 'users/registrations'
}
# rails routes で確認(omniauth_callbackコントローラーを介し、APIにリクエストを送る)。

ここで、環境変数を設定できてるか確認しとく。

ターミナル
% rails c
irb(main):001:0> ENV['FACEBOOK_KEY']  => "1111111111111"
irb(main):002:0> ENV['FACEBOOK_SECRET']  => "1a1a1a1a1a1a1"

irb(main):001:0> ENV['TWITTER_API_KEY']  => "1111111111111"
irb(main):002:0> ENV['TWITTER_API_SECRET']  => "1a1a1a1a1a1a1"

irb(main):003:0> ENV['GOOGLE_CLIENT_ID']  => "~~~~~~googleusercontent.com"  # 末尾を確認
irb(main):004:0> ENV['GOOGLE_CLIENT_SECRET']  => "1a1a1a1aa1_1a1a1_1a"

後は、モデルとコントローラーでメソッドを記述し、呼び出せるようにする。

22
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
28