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 %>
|