前回(http://taksatou.blogspot.com/2011/03/twitterfacebookrails.html) 、OAuthで認証するところまでできたので、今回はtwitterアカウントでログインするところを作ります。
omniauthのrailsチュートリアルビデオのpart2に大体対応してますが、ここでの内容はちょっと変えてます。
- http://railscasts.com/episodes/236-omniauth-part-2
以下のようにしてdeviseのセットアップとmigrationをします。
emailとpasswordはつかわないので消します。
rails g devise:install
rails g devise user
rails g migration AddOauthTokenAndOauthTokenSecretToAuthentications oauth_token:string oauth_token_secret:string
rails g migration RemoveEmailAndEncryptedPasswordAndPasswordSaltFromUsers email:string encrypted_password:string password_salt:string
rake db:migrate
class Authentication < ActiveRecord::Base
belongs_to :user
end
- attr_accessibleは必要ないので消します
class User < ActiveRecord::Base
has_many :authentications
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable
def password_required?
false
end
end
- 今回の場合、userは一つのtwitter認証情報をもつだけなのでhas_manyはおかしいと思うかもしれないですが、今後facebookとかとも連動させたくなったときのためにこうしてます。
- devise の :validatable パラメータは削除してます。
前回編集したAuthenticationsControllerをさらに以下のように編集します。
class AuthenticationsController < ApplicationController
def create
omniauth = request.env['omniauth.auth']
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
if authentication
sign_in_and_redirect(:user, authentication.user)
elsif current_user # 既にログインしてるけど、facebookとかの権限も追加するとき
current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'],
:oauth_token => omniauth['credentials']['token'],
:oauth_token_secret => omniauth['credentials']['secret'])
redirect_to authentications_url
else # 新規ユーザのとき
user = User.new
user.authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'],
:oauth_token => omniauth['credentials']['token'],
:oauth_token_secret => omniauth['credentials']['secret'])
user.save!
sign_in_and_redirect(:user, user)
end
end
確認用にauthenticateのviewを以下のように編集します
<h1>Authentications</h1>
<% if user_signed_in? %>
Signed in as <%= current_user.id %>
Not you ? <%= link_to "Sign out", destroy_user_session_path %>
<% else %>
<%= link_to "Sign in", "/auth/twitter" %>
<% end %>
<table>
<tr>
<th>User</th>
<th>Provider</th>
<th>Uid</th>
</tr>
<% if @authentications %>
<% for authentication in @authentications %>
<tr>
<td><%= authentication.user_id %></td>
<td><%= authentication.provider %></td>
<td><%= authentication.uid %></td>
<td><%= link_to "Destroy", authentication, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
<% end %>
</table>
前回設定した内容にdevise用の設定も追加します
devise_for :users
resources :authentications
match '/auth/:provider/callback' => 'authentications#create'
root :to => "authentications#index"
以上でセットアップはおわりです。
実際に http://localhost:3000/authentications にアクセスしてsign in をクリックしてうまくログインできれば成功です。
以下のようにすればコンソールでtwitterにポストの確認ができるはずです。
$ rails c
Twitter.configure do |config|
config.consumer_key = 'CONSUMER_KEY'
config.consumer_secret = 'CONSUMER_SECRET'
config.oauth_token = User.all[0].authentications[0].oauth_token
config.oauth_token_secret = User.all[0].authentications[0].oauth_token_secret
end
Twitter.update 'hello, omniauth!'
- 結構大変でした
- deviseとかomniauthとかそもそもrailsのことをよくわかってないので間違ってたら教えてください