2016年4月20日 星期三

Published 凌晨1:49 by with 0 comment

Rails User 建立-2 (手機email註冊,隱藏yml,手機fb註冊) - 我在ALPHACamp 59天


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. 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 官方文件




      edit

0 意見:

張貼留言