$ bundle exec rails g devise User
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :lockable, :timeoutable, :omniauthable, omniauth_providers: [:twitter] end
class DeviseCreateUsers < ActiveRecord::Migration 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 ## Twitter認証用 t.string :provider t.string :uid t.string :username, default: "anonymous" t.timestamps end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true add_index :users, :unlock_token, unique: true end end
bundle exec rake db:migrate
undefined method omniauth_authorize_path
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, :lockable, :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"] end 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 end
devise_for :users, controllers: { :omniauth_callbacks => "omniauth_callbacks" }
#ref(): File not found: "sign_up.png" at page "Devise/Twitter認証/古い内容"
def self.from_omniauth(auth) user = where(provider: auth["provider"], uid: auth["uid"]).first return user if user user = User.new user.provider = auth["provider"] user.uid = auth["uid"] user.username = auth["info"]["nickname"] user.email = "#{auth.provider}-#{auth.uid}@example.com" user.password = Devise.friendly_token[0,20] #これが必要? user def password_required? provider.blank? && super end end
<h2>Sign up</h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <%= @user.username %>を登録します。 <div class="actions"> <%= f.submit "Sign up" %> </div> <% end %> <%= render "devise/shared/links" %>