1. 手機使用者註冊
(用 email / password 註冊)
這次專案的做法是使用Devise來管控使用者,
使用者可以在手機上註冊的觀念:
手機傳一個 POST JSON 給後端 後端寫入後回傳一個 authentication_token
a. /app/controllers/api_v1/auth_controller.rb 新增
def signup
#POST /api/v1/signup
if params[:email] && params[:password]
user = User.new(:email => params[:email], :password => params[:password])
if user.save
render :json => { :auth_token => user.authentication_token }, :status => 200
else
render :json => {}, :status => 400
end
else
render :json => { :message => "email or password is not correct" }, :status => 401
end
end
b. config/routes.rb 新增post "/signup" => "auth#signup"
註:1. email格式需在前端認證
2. 密碼也可以在前端請使用者輸入兩次
2. 密碼也可以在前端請使用者輸入兩次
2. Facebook app_id & secret 隱藏
註冊facebook 開發者之後 會得到 app_id & secret 這資料是需要被保護的
所以這檔案在每次 git 時不會被其他人看到
a. 先將資料移開,新增 config/facebook.yml
development:
facebook:
app_id: #請輸入你的
secret: #我絕對不會給你的
b. 修改 config/initializers/devise.rb內的資料
fb_config = Rails.application.config_for(:facebook) config.omniauth :facebook, fb_config["facebook"]["app_id"], fb_config["facebook"]["secret"], :scope => 'public_profile,email', :info_fields => 'email,name'
c. 在 .gitignore 其中 # Ignore all logfiles and tempfiles.底下新增
/config/facebook.yml
3. Facebook 手機註冊&登入
使用者登入流程:
1. 使用者點選 facebook登入 => (這時候會連去facebook 請使用者確認)
2. 使用者點選確認 => facebook 回傳 access_token給使用者, 使用者傳給server
3. 此時我們有了 該user的 access_token 再去跟facebook 的 Graph API要資料
4.facebook 回傳資料 server 進行比對 1. 有 fb_id =>登入
2. 有 email=>登入
3. 什麼都沒有=> 創造新使用者
後台主要在寫後面這兩項
可以找之前的code 會發現 omniauth 在 model/user.rb 之中已經有做了第4步.
所以這邊主要是會來寫 第3步
--------------這邊是講概念, 實作可跳過--------------
先來講解 Graph API 是什麼
在 omniauth 在 model/user.rb 有用 access_token 跟 Graph API
res = RestClient.get "https://graph.facebook.com/v2.4/me", { :params => { :access_token => access_token } }
版本是 v2.4 拿access_token 到 Graph API 測試工具 裡面玩 可以看到
about/birthday 是無法取得(因為我沒有設定公開)
我點選右邊 Get Token 設定 點選 user_birthday
畫面會跳出以下
此時就會有了 birthday
從這邊我們可以知道每個access_token 會因為要要求的內容不同有不一樣的結果
--------------以上是講概念, 實作可跳過--------------
所以這時候我們會取得 access_token 然後跟 Graph API要資料
首先我們要跟他說 我們要哪些資料
在 app/model/user.rb 之中
res = RestClient.get "https://graph.facebook.com/v2.4/me", { :params => { :access_token => access_token } }
這邊沒辦法帶值回來, 所以要改成以下:
res = RestClient.get "https://graph.facebook.com/v2.4/me", { :params => { :fields => "email,name", :access_token => access_token } }
接下來的方法要判讀回傳的資料 然後動作 類似 login 那段 params[:access_token]
所以我們會在 /app/controllers/api_v1/auth_controller.rb 新增
<這邊沒有遵照 don't repeat yourself >
def signup
success = false
#POST /api/v1/signup
if params[:email] && params[:password]
user = User.new(:email => params[:email], :password => params[:password])
if user.save
render :json => { :auth_token => user.authentication_token }, :status => 200
else
render :json => {}, :status => 400
end
elsif params[:access_token]
fb_data = User.get_fb_data( params[:access_token] )
if fb_data
auth_hash = OmniAuth::AuthHash.new({
uid: fb_data["id"],
info: {
email: fb_data["email"]
},
credentials: {
token: params[:access_token]
}
})
user = User.from_omniauth(auth_hash)
end
success = fb_data && user.persisted?
end
if success
render :json => { :auth_token => user.authentication_token,
:user_id => user.id}, :status => 200
else
render :json => { :message => "email or password is not correct" }, :status => 401
end
end
但因為會使用到 "rest-client" 所以請確認是否有安裝在 gemfile 新增 gem "rest-client"
bundle 後 server 重開
-----後記-----
用 Devise + omiauth - facebook 做 網頁的登入
所使用的資料是透過 omiauth 整理後 回傳到資料庫裡面
手機 API 方式 使用RestClient Get 取得.
好文必看!
Graph API是什麼東東?
Graph API 官方文件
0 意見:
張貼留言