Devise/Twitter認証/古い内容
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
&tag(Devise/Twitter認証/古い内容);
*目次 [#q988ae2a]
#contents
*関連ページ [#na1b9ce8]
*参考情報 [#sf94cf6e]
-[[[*Rails*] deviseの使い方 - Qiita:http://qiita.com/ciga...
-[[Railsのログイン認証gemのDeviseとOmniAuth-Twitterの連携...
-[[deviseでfacebook,twitter認証 - Qiita:http://qiita.com/...
*概要 [#ifa27315]
-Twitterにログインしその情報をユーザーとして利用する。
*Userモデルの生成 [#iab10e2a]
-Userモデルを生成する
$ bundle exec rails g devise User
-user.rbを以下のように編集する。参考情報と異なりconfirmab...
#pre{{
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :valida...
:lockable, :timeoutable, :omniauthable, omniauth...
end
}}
-マイグレーションファイルの編集
-以下ようにする。
#pre{{
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 rec...
## Lockable
t.integer :failed_attempts, default: 0, null: fals...
t.string :unlock_token # Only if unlock strategy ...
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
}}
-migration実行
bundle exec rake db:migrate
-このままだとエラーになってログインできない。
undefined method omniauth_authorize_path
*Twitterアプリケーションの登録 [#a5b66981]
-https://apps.twitter.com/ からアプリケーションを登録する。
-callback_urlは開発環境と本番環境で異なるので2個登録して...
-開発環境の場合Callback URLは次のように設定する。localhos...
http://127.0.0.1:3000/users/omniauth_callbacks
*Twitter認証のための準備 [#bf34e74a]
**devise.rbの編集 [#h0f62ea4]
-config/initializers/devise.rbを編集
#pre{{
config.omniauth :twitter, "Consumer Key", "Consumer Secr...
}}
-この段階で「Sign in with Twitter」からログインすると一応...
-しかしcallbackが設定されていないのでエラーとなる。
The action 'twitter' could not be found for Devise::Omni...
**コールバック用コントローラーの生成 [#ob148449]
-Twitterログイン画面から戻ってきたときに呼び出される処理...
bundle exec rails g controller omniauth_callbacks
-内容を編集。親クラスがDevise::OmniauthCallbacksControlle...
#pre{{
class OmniauthCallbacksController < Devise::OmniauthCallb...
def twitter
@user = User.from_omniauth(request.env["omniauth.auth...
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
}}
**Userモデルの変更 [#r6adae74]
-from_omniauthとnew_with_sessionを作成する。
#pre{{
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :valida...
:lockable, :timeoutable, :omniauthable, omniauth...
def self.from_omniauth(auth)
where(provider: auth["provider"], uid: auth["uid"]).f...
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_prot...
user.attributes = params
user.valid?
end
else
super
end
end
end
}}
**ルートの設定 [#p359fbf7]
-routes.rbを編集。omniauth_callbacks_controllerが呼ばれる...
devise_for :users, controllers: { :omniauth_callbacks =>...
**処理の流れ [#l9ba643b]
-初回登録時Twitterログイン画面から戻りOmniauthCallbacksCo...
-Userのnew_with_sessionはページをまたいでTwitterのアカウ...
-Twitterの場合Twitterのアカウント情報からメールアドレスを...
#ref(Devise/Twitter認証/sign_up.png)
**再ログイン時の流れ [#qddd978f]
-Rememberableを実装している場合、Cookieから認証情報を構築...
-ただしCookie有効期間が切れるとTwitterサイトを使った再ロ...
*Twitter認証の改良 [#gbd56603]
**目標 [#u7c24ff7]
-直接TwitterログインリンクをクリックしTwitterのログイン画...
-メール、パスワードの入力はなし。
**User.from_omniauthの修正 [#e502f738]
-オリジナルではUser.from_omniauthのレコード生成を試み、パ...
-whereで検索する処理とnewでダミーユーザーを生成する処理に...
-また登録画面でパスワード未入力のエラーが表示されないよう...
#pre{{
def self.from_omniauth(auth)
user = where(provider: auth["provider"], uid: auth["u...
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.c...
user.password = Devise.friendly_token[0,20] #これが必...
user
def password_required?
provider.blank? && super
end
end
}}
**ログイン画面の修正 [#l0829a8d]
-registrations/new.html.erbを変更。
-Twitterのログイン画面からもどってきたあと登録しようとし...
#pre{{
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registrati...
<%= devise_error_messages! %>
<%= @user.username %>を登録します。
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
}}
終了行:
&tag(Devise/Twitter認証/古い内容);
*目次 [#q988ae2a]
#contents
*関連ページ [#na1b9ce8]
*参考情報 [#sf94cf6e]
-[[[*Rails*] deviseの使い方 - Qiita:http://qiita.com/ciga...
-[[Railsのログイン認証gemのDeviseとOmniAuth-Twitterの連携...
-[[deviseでfacebook,twitter認証 - Qiita:http://qiita.com/...
*概要 [#ifa27315]
-Twitterにログインしその情報をユーザーとして利用する。
*Userモデルの生成 [#iab10e2a]
-Userモデルを生成する
$ bundle exec rails g devise User
-user.rbを以下のように編集する。参考情報と異なりconfirmab...
#pre{{
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :valida...
:lockable, :timeoutable, :omniauthable, omniauth...
end
}}
-マイグレーションファイルの編集
-以下ようにする。
#pre{{
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 rec...
## Lockable
t.integer :failed_attempts, default: 0, null: fals...
t.string :unlock_token # Only if unlock strategy ...
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
}}
-migration実行
bundle exec rake db:migrate
-このままだとエラーになってログインできない。
undefined method omniauth_authorize_path
*Twitterアプリケーションの登録 [#a5b66981]
-https://apps.twitter.com/ からアプリケーションを登録する。
-callback_urlは開発環境と本番環境で異なるので2個登録して...
-開発環境の場合Callback URLは次のように設定する。localhos...
http://127.0.0.1:3000/users/omniauth_callbacks
*Twitter認証のための準備 [#bf34e74a]
**devise.rbの編集 [#h0f62ea4]
-config/initializers/devise.rbを編集
#pre{{
config.omniauth :twitter, "Consumer Key", "Consumer Secr...
}}
-この段階で「Sign in with Twitter」からログインすると一応...
-しかしcallbackが設定されていないのでエラーとなる。
The action 'twitter' could not be found for Devise::Omni...
**コールバック用コントローラーの生成 [#ob148449]
-Twitterログイン画面から戻ってきたときに呼び出される処理...
bundle exec rails g controller omniauth_callbacks
-内容を編集。親クラスがDevise::OmniauthCallbacksControlle...
#pre{{
class OmniauthCallbacksController < Devise::OmniauthCallb...
def twitter
@user = User.from_omniauth(request.env["omniauth.auth...
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
}}
**Userモデルの変更 [#r6adae74]
-from_omniauthとnew_with_sessionを作成する。
#pre{{
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :valida...
:lockable, :timeoutable, :omniauthable, omniauth...
def self.from_omniauth(auth)
where(provider: auth["provider"], uid: auth["uid"]).f...
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_prot...
user.attributes = params
user.valid?
end
else
super
end
end
end
}}
**ルートの設定 [#p359fbf7]
-routes.rbを編集。omniauth_callbacks_controllerが呼ばれる...
devise_for :users, controllers: { :omniauth_callbacks =>...
**処理の流れ [#l9ba643b]
-初回登録時Twitterログイン画面から戻りOmniauthCallbacksCo...
-Userのnew_with_sessionはページをまたいでTwitterのアカウ...
-Twitterの場合Twitterのアカウント情報からメールアドレスを...
#ref(Devise/Twitter認証/sign_up.png)
**再ログイン時の流れ [#qddd978f]
-Rememberableを実装している場合、Cookieから認証情報を構築...
-ただしCookie有効期間が切れるとTwitterサイトを使った再ロ...
*Twitter認証の改良 [#gbd56603]
**目標 [#u7c24ff7]
-直接TwitterログインリンクをクリックしTwitterのログイン画...
-メール、パスワードの入力はなし。
**User.from_omniauthの修正 [#e502f738]
-オリジナルではUser.from_omniauthのレコード生成を試み、パ...
-whereで検索する処理とnewでダミーユーザーを生成する処理に...
-また登録画面でパスワード未入力のエラーが表示されないよう...
#pre{{
def self.from_omniauth(auth)
user = where(provider: auth["provider"], uid: auth["u...
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.c...
user.password = Devise.friendly_token[0,20] #これが必...
user
def password_required?
provider.blank? && super
end
end
}}
**ログイン画面の修正 [#l0829a8d]
-registrations/new.html.erbを変更。
-Twitterのログイン画面からもどってきたあと登録しようとし...
#pre{{
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registrati...
<%= devise_error_messages! %>
<%= @user.username %>を登録します。
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
}}
ページ名: