最近在學RoR,把之前的東西改了一下變成可用的東西,紀錄與分享之。
讓RoR使用Facebook登入只要簡單的數個步驟 ( 不安裝奇怪的gem的情況下 )
假設網站的網域叫做 http://localhost:3000/
跟Facebook連結的Url叫做 http://localhost:3000/connect/ (推薦最後加 / )
1. 讓網站重新導向到 Facebook 的授權頁面 → 按確定之後會自動跳轉回自己網站的"那個url"
#跳轉的頁面url會像是這樣 http://localhost:3000/connect/?code=*****
2. 根據我們獲得的 code , 我們再去抓一個特定網址的內容,裡面的內容像是
access_token=********&***=****
#最重要的就是抓到那個access_token,有了他我們就能呼叫 Facebook的 Graph API
3. 用access_token去呼叫Graph API取得使用者的 Facebook ID, Name, Mail, 再跟內建 的User合併 ( 如果是authlogin做的使用者可能需要查一下對應的屬性 )
實際Code如下,只要做一個Controller,把他加到routes就好了
routes.rb 加上
match '/connect' => 'page#connect'
page_controller.rb
|
require 'uri'
require 'json'
require 'net/http'
class PageController < ApplicationController
# 呼叫 Facebook API
def fapi(path)
token = session[:fb]
url = "https://graph.facebook.com/"+path+"?access_token="+token
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # read into this
return JSON.parse((http.request Net::HTTP::Get.new(uri.request_uri)).body)
end
# 將Facebook物件與User結合,這個函式的內容因User的結構而異
def connect_acc(fuser)
@u = User.find_by_mail(fuser['email'])
if @u.nil? # 建立新的使用者
@u = User.new
@u.name = fuser['name']
@u.mail = fuser['email']
@u.fb = fuser['id']
@u.fb_token=session['fb']
@u.pwd = "1234567" # 密碼應該用各種方式產生
@u.save
else # 如果有使用此Email的使用者,則與他結合
@u.update_attributes(:name=>fuser['name'],:fb=>fuser['id'],:fb_token=>session['fb'])
session[:mail] = @u.mail # 自動登入!!!!
respond_to do |f|
f.html {redirect_to '/shelf'}
end
end
end
# 需要改裡面的常數 API_KEY 跟 SECRET_KEY
def connect
aPP_HOST = "http://"+request.headers['Host']+"/connect/"
@fACEBOOK_API_KEY = '*************'
@fACEBOOK_SECRET_KEY = '***********'
authcode = params[:code]
if authcode
url = "https://graph.facebook.com/oauth/access_token?client_id="+@fACEBOOK_API_KEY+"&redirect_uri="+aPP_HOST+"&client_secret="+@fACEBOOK_SECRET_KEY+"&code="+authcode
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # read into this
@out = (http.request Net::HTTP::Get.new(uri.request_uri)).body
# 抓出access_token 記錄在session裡
session[:fb] = @out[@out.index('=')+1,@out.index('&')-@out.index('=')-1]
# 呼叫FB API 抓出各種資料
@fuser=fapi("me")
# 結合User
connect_acc(@fuser)
# 重新導向到首頁
respond_to do |f|
f.html { redirect_to("/") };
end
else
respond_to do |f|
f.html { redirect_to("https://graph.facebook.com/oauth/authorize?client_id="+@fACEBOOK_API_KEY+"&redirect_uri="+aPP_HOST+"&scope=read_friendlists,offline_access,publish_stream,user_about_me,email&response_type=code") };
end
end
end
end
|
※注意要去 https://developers.facebook.com/apps 申請 API_KEY跟SECRET_KEY 然後設定好網站Domain才能使用
params[:code] 打印出来是nil 请问是为什么?
回覆刪除