icps

notes

Fb_login

ref :http://fisherliang.logdown.com/posts/301654-ruby-on-rails-real-facebook-login-mechanism
ref https://github.com/laserlemon/figaro

1
2
3
4
gem "figaro"
gem 'devise'
gem 'omniauth'
gem 'omniauth-facebook'

figaro install

1
2
3
4
5
#===> create  config/application.yml
#===> append  .gitignore
# config/application.yml
fb_app_id: "xxxxxxxxxxxxxx"
fb_secret: "xxxxxxxxxxxxxxxxxxxxxxxxx"

rails generate devise:install

1
2
3
# config/initializers/devise.rb
config.authentication_keys = [:name] #37
config.omniauth :facebook, Figaro.env.fb_app_id, Figaro.env.fb_secret, scope: 'email', info_fields: 'email, name'

rails generate devise User

1
2
3
4
5
6
7
8
9
10
11
12
# rails g migration add_omniauth_to_users provider:index uid:index name:index
# db/migrate/add_omniauth_to_users.rb
class AddOmniauthToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :provider, :string
    add_index :users, :provider
    add_column :users, :uid, :string
    add_index :users, :uid
    add_column :users, :name, :string, :null => false, :default => ""
    add_index :users, :name
  end
end

rake db:migrate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# app/models/user.rb
class User < ActiveRecord::Base
  def email_required? #email空白
      false
  end

  def name_changed?
      false
  end
  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :trackable, :validatable,
  :omniauthable, :omniauth_providers => [:facebook]

  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.email = auth.info.email
          user.name = auth.info.name
          user.password = Devise.friendly_token[0,20]
      end
  end
end

1
2
3
4
5
6
# config/routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: { omniauth_callbacks: "omniauth_callbacks" }
  resources :products
  root 'products#index'
end

1
2
3
4
5
6
7
# app/controllers/omniauth_callbacks_controller.rb 
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
    def facebook
        @user = User.from_omniauth(request.env["omniauth.auth"])
        sign_in_and_redirect @user
    end
end

1
2
3
4
5
6
#fb image
def user_image(user,size)
  if not user.uid == nil
      link_to(image_tag("http://graph.facebook.com/#{user.uid}/picture", :size => size), "https://www.facebook.com/#{user.uid}")
  end
end

1
2
3
4
5
6
7
8
9
<% if current_user %>
 <%= current_user.name %>
  <%= user_image(current_user,"50x50") %>
 <%= link_to "登出", destroy_user_session_path, method: :delete %>
<% else %>
  <%= link_to "註冊", new_user_registration_path %>
 <%= link_to "登入", new_user_session_path %>
 <%= link_to("Facebook Login",user_facebook_omniauth_authorize_path) %>
<% end %>