Tag: Devise/Twitter認証
gem 'devise' gem 'omniauth-twitter'
bundle exec rails g scaffold book title:string author:string summary:text
bundle exec rails g devise:install
bundle exec rails g devise user
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable end
class DeviseCreateUsers < ActiveRecord::Migration[5.1] def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, 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.string :current_sign_in_ip t.string :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 ## Twitter認証用 t.string :provider t.string :uid t.string :username, default: "anonymous" end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end
bundle exec rails db:migrate
http://127.0.0.1:3000/users/omniauth_callbacks
config.omniauth :twitter, "Consumer Key", "Consumer Secret"
The action 'twitter' could not be found for Devise::OmniauthCallbacksController
bundle exec rails g controller omniauth_callbacks
class OmniauthCallbacksController < Devise::OmniauthCallbacksController def twitter @user = User.from_omniauth(request.env["omniauth.auth"].except("extra")) if @user.persisted? flash.notice = "ログインしました!" sign_in_and_redirect @user else session["devise.user_attributes"] = @user.attributes redirect_to new_user_registration_url end end end
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, # :confirmable, :lockable, :timeoutable, :omniauthable, omniauth_providers: [:twitter] :timeoutable, :omniauthable, omniauth_providers: [:twitter] def self.from_omniauth(auth) where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |user| user.provider = auth["provider"] user.uid = auth["uid"] user.username = auth["info"]["nickname"] # user.email = Devise.friendly_token[0,20] user.email = "#{auth.provider}-#{auth.uid}@example.com" user.password = Devise.friendly_token[0,20] #これが必要? end end def remember_me # http://stackoverflow.com/questions/14417201/how-to-automatically-keep-user-remembered-in-devise true end def self.new_with_session(params, session) if session["devise.user_attributes"] new(session["devise.user_attributes"], without_protection: true) do |user| user.attributes = params user.valid? end else super end end def password_required? super && provider.blank? end def email_required? super && provider.blank? end end
devise_for :users, controllers: { :omniauth_callbacks => "omniauth_callbacks" }
<!DOCTYPE html> <html> <head> <title>Rails5DeviseTwitterDemo</title> <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <header> <nav> <% if user_signed_in? %> <strong<%= link_to current_user.username, pages_show_path %></strong> <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %> <% else %> <%= link_to 'ログイン', user_twitter_omniauth_authorize_path %> <% end %> </nav> </header> <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> <%= yield %> </body> </html>
bundle exec rails g devise:views
class UsersController < RegularController include ApplicationHelper #http://stackoverflow.com/questions/7458723/using-devise-to-create-private-profiles ユーザー以外がアクセスするとリダイレクト before_action :verify_owner, only: [:show, :edit, :destroy] def verify_owner redirect_to root_url unless current_user.username == params[:id] end
http://本番サイトのURL/users/auth/twitter/callback http://localhost:3000/users/auth/twitter/callback
Devise.setup do |config| config.omniauth :twitter, "TWITTER_CONSUMER_KEY", "TWITTER_CONSUMER_SECRET", callback_url: 'http://localhost:3000/users/auth/twitter/callback' end
$ bundle exec rake routes | grep callback user_twitter_omniauth_callback GET|POST /users/auth/twitter/callback(.:format)