2016-08-10 25 views
5

Mam w pełni zintegrowaną usługę Firebase Auth w mojej aplikacji na Androida, teraz chcę, aby klient wchodził w interakcje z moim zapleczem (szyną), używając unikalnego tokena. moje pytanie jest takie jak to zrobić:Jak korzystać z Firebase Auth z Rails?

  1. Użytkownik nie jest zalogowany, stosując na przykład Facebooka Auth,
  2. Wyślij Firebase token do backend i zweryfikować
  3. odpowiedzieć na kliencie z unikalnym token nadchodzące żądania API (uzyskać dane użytkowników, zapisać dane użytkownika ...)

Dziękuję

Odpowiedz

1

nie trzeba krok 3. Firebase Auth Android SDK getToken() API zwraca krótkotrwały (jednogodzinny) token Firebase Auth ID dla zalogowanego użytkownika i automatycznie zwraca nowy token, jeśli wygasł poprzedni.

W artykule Firebase token verification doc opisano, jak uzyskać token Firebase w aplikacji klienckiej i zweryfikować token po stronie serwera.

+0

Doc wymienione powyżej nie mają Rails –

0

Biorąc odpowiedź JinLiu do przodu, gdy pojawi się token w kodzie android, wysłać go do backend powiedzieć: https://www.yourbackend.com?authenticate?token=asdad7687h ... Zauważ, że znak generowany przez Firebase jest wyrazem JWT, musimy najpierw sprawdzić jego autentyczność i dekodować go w backend. W tym celu musisz dodać te dwa klejnoty do gemfile gem 'jwt', '1.5.6' gem 'rest-client', '2.0.1' Po wykonaniu tego musisz dodać te dwa (private) w twoim kontrolerze:

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 

Możesz teraz wywołać funkcję get_set_user jak poprzednio, aby zobaczyć, czy użytkownik ma ważny token. Pomysł jest prosty. Sprawdź, czy token jest podpisany przez jeden z kluczy wymienionych pod numerem https://www.googleapis.com/robot/v1/metadata/x509/[email protected]. Jeśli tak, zdekodować token i uzyskać identyfikator bazy ogniowej.

0

Opracowałem klejnot firebase_id_token.
Zajmuje się wszystkimi certyfikatami/podpisem biznesowym.

To może być po prostu jak:
realizacji FirebaseIdToken::Signature.verify(token)

Powiązane problemy