2016-08-10 85 views
5

我已將Firebase身份驗證完全集成到了我的Android應用程序中,現在我希望客戶端使用唯一的令牌與我的後端(導軌)進行交互。我的問題是它是如何做:如何使用Rails進行Firebase身份驗證?

  1. 用戶的登錄,例如使用Facebook的身份驗證,
  2. 發送火力地堡令牌到後端,並用獨特的令牌用於驗證
  3. 響應客戶端即將到來的API請求(獲取用戶數據,保存用戶數據...)

謝謝

回答

1

你不需要步驟#3。 Firebase Auth Android SDK getToken() API會爲登錄用戶返回一個短期(一小時)的Firebase身份驗證令牌,如果前一次過期,則會自動返回一個新令牌。

Firebase token verification doc描述瞭如何在客戶端應用上獲取Firebase令牌並驗證服務器端的令牌。

+0

上面提到的文檔沒有Rails的實現 –

0

以JinLiu的回答着,一旦你在你的Android代碼獲得令牌,將其發送到後端說:https://www.yourbackend.com?authenticate?token=asdad7687h ... 注意,由火力地堡生成的令牌是智威湯遜的道理,我們需要先驗證其真實性並在後端對其進行解碼。爲此,您需要將這兩個寶石添加到您的寶石文件 gem'jwt','1.5.6' gem'rest-client','2.0.1' 完成後,您需要添加這兩個)功能在你的控制器:

def get_set_user 
    begin 
     token = params[:token] 
     if token.nil? 
      @user = nil 
      return 
     end 
     firebase_id = verify_user(token)[0]["user_id"] 
     if User.where(:firebase_id => firebase_id).exists? 
      @user = User.where(:firebase_id => firebase_id).first 
     else 
      @user = User.new(:firebase_id => firebase_id) 
      @user.save 
      @user 
     end 
    rescue 
     @user = nil 
    end 
end 

def verify_user(token) 
    certificate_url = "https://www.googleapis.com/robot/v1/metadata/x509/[email protected]" 
    myresponse = RestClient.get(certificate_url).body 
    certificates = JSON.parse myresponse.gsub('=>', ':') 
    myjson ="" 
    certificates.each do|key , value| 
    begin 
     x509 = OpenSSL::X509::Certificate.new(value) 
     iss = 'https://securetoken.google.com/<yourdomain>' 
     aud = 'yourdomain' # change this 
     myjson = JWT.decode(token, x509.public_key, true, 
     {    algorithm: "RS256", verify_iat: true , 
         iss: iss , verify_iss: true , 
         aud: aud , verify_aud: true 
     }) 

     return myjson 

    rescue 
    end 
    end 

    return nil  

end 

現在,您可以撥打get_set_user作爲行動之前看到的,如果用戶具有有效的令牌。 這個想法很簡單。檢查令牌是否由https://www.googleapis.com/robot/v1/metadata/x509/[email protected]上提到的其中一個密鑰簽署。如果是,解碼令牌並獲取Firebase ID。

0

我開發了firebase_id_token寶石。
它處理所有的證書/簽名業務。

它可以簡單地爲:
FirebaseIdToken::Signature.verify(token)

相關問題