&tag(Devise/Twitter認証/古い内容);
$ 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" %>