5

Próbuję utworzyć niestandardowego uwierzytelniania z nowym Firebase SDK google następującym tych wytycznych: https://firebase.google.com/docs/auth/server#use_a_jwt_library
w kodzie samble mówi:Konfigurowanie Firebase v3 niestandardowego uwierzytelniania z php

Get your service account's email address and private key from the JSON key file

Niestety nie mam pojęcia, skąd wziąć ten plik json. Jeśli przejdę do konsoli firebase (https://console.firebase.google.com/) uda mi się pobrać plik json, ale nie zawiera on adresu e-mail ani klucza prywatnego.

Udało mi się znaleźć plik json zawierający adres e-mail i klucz prywatny w mojej platformie Google Cloud Platform (http://console.cloud.google.com) przez goind w menu "API Manager> Credentials". Zaskakująco pokazała się tam moja aplikacja firebase. I skopiować i wkleić do wiadomości e-mail i klucz do kodu próbki, potem mam ten błąd:

Warning: openssl_sign(): supplied key param cannot be coerced into a private key in /volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php on line 183 Fatal error: Uncaught exception 'DomainException' with message 'OpenSSL unable to sign data' in /volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php:185 Stack trace: #0 /volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php(154): Firebase\JWT\JWT::sign('eyJ0eXAiOiJKV1Q...', NULL, 'RS256') #1 /volume1/web/yeti/jwt.php(21): Firebase\JWT\JWT::encode(Array, NULL, 'RS256') #2 /volume1/web/yeti/jwt.php(24): create_custom_token('1234', false) #3 {main} thrown in /volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php on line 185

Czy ktoś ma pomysł co robię źle?

Dzięki

+0

project Firebase jest "tylko" to specjalny typ projektu Google Cloud Platform, dzięki czemu Firebase projekty rzeczywiście mają pokazać się w Google Cloud Konsola platformy. Podczas tworzenia konta usługi zobacz pierwszy akapit w [ten link] (https://firebase.google.com/docs/database/server/start#server-sdk-authentication) –

+0

Dziękuję za odpowiedź. Ale wciąż nie działa. Czy to, co wyjaśniono w linku. Nadal pojawia się ten sam błąd. _ (Ostrzeżenie: openssl_sign(): podany kluczowy parametr nie może być wymuszony na klucz prywatny) _ –

Odpowiedz

2

Znaleźliśmy moje ja, co było nie tak! Przykładowy kod php z dokumentacji jest błędny. Zamiast

return JWT::encode($payload, $private_key, "RS256"); 

użytku

return JWT::encode($payload, $private_key, "HS256"); 

Edit:
Faktycznie, to była tylko próbka php kod z google doc Firebase że był całkowicie buggy. przekazywał pusty klucz do php-jwt. Wygląda na to, że zaktualizowali go dzisiaj i działa dobrze :)

+0

Świetnie jest usłyszeć, że znalazłeś problem i dzięki za zgłoszenie! Dodam notatkę, że musimy zaktualizować dokumentację. –

+0

Istnieje również błąd składniowy w przykładowym kodzie php w tym wierszu: '" claim "=> array ( " premium_account "=> $ is_premium_account ); '; należy usunąć –

+3

Ten token absolutnie nie zostanie zatwierdzony. Google korzysta tylko z JWT RS256. – foxxtrot

3

Czy znalazłeś rozwiązanie? Nadal doświadczasz tego samego problemu! Współpracuje z HS256 i nie współpracuje z RS256. Czy jest to ograniczenie Google w chmurze?


Dziękuję bardzo! @dbburgess

Problem: Użyto złego klucza i wiadomości e-mail. Powinny zostać wygenerowane w sekcji poświadczeń Google Cloud, która odpowiada projektowi Firebase.

Rozwiązanie:

  • Przejdź do 'console.cloud.google.com'.
  • Wybierz powiązany projekt Firebase.
  • Następnie "Menedżer API" -> "Poświadczenia".
  • "Utwórz poświadczenia" -> "Klucz konta usługi" -> Wybierz JSON.
  • Utworzony plik będzie zawierał wymagany "prywatny_key" & "client_email".

Wypełnić wartości:

SERVICE_ACCOUNT_EMAIL $ = „[email protected] "; $ private_key =" ----- BEGIN PRIVATE KEY ----- \ nSoneVeryVeryLongKey = \ n ----- END PRIVATE KEY ----- \ n "; $ uid = 'UserToUseInFirebaseRules' ; $ is_premium_account = $ uid;

nie powinno być potrzeby niczego zmieniać w funkcji „create_custom_token” może datę ważności/czas zgodnie ze swoimi potrzebami

Następnie wywołać funkcję.

create_custom_token($uid, $is_premium_account); 
+0

Co funkcja jest create_custom_token? – user2722667

+0

To jest wzięte z dokumentacji. – MyUserInStackOverflow

2

To jest to, co robię i działa dobrze.To, co podajesz w tablicy claims, pojawia się na auth w zasadach bezpieczeństwa. E-mail i klucz pochodzą z pliku json, który otrzymasz pod numerem create a service account (patrz: Przed rozpoczęciem sekcji).

$userId = '1234'; 
$email = '[email protected]'; 
$key = 'giant_key_goes_here'; 

$payload = [ 
    'iss' => $email, 
    'sub' => $email, 
    'aud' => 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit', 
    'iat' => time(), 
    'exp' => time() + 60 * 60, 
    'uid' => $userId, 
    'claims' => [ 
     'uid' => $userId, 
    ], 
]; 

$token = JWT::encode($payload, $key, 'RS256'); 

Warto zauważyć, format na klawiszach jest trochę trudne ... Klucz będzie wyglądać mniej więcej tak (tylko kluczową przykład):

-----BEGIN PRIVATE KEY----- 
MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp 
wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5 
1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh 
3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2 
pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX 
GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il 
AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF 
L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k 
X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl 
U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ 
37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0= 
-----END PRIVATE KEY----- 

Być może trzeba zrobić trochę fantazyjne formatowanie, to jest w zasadzie to, co zrobiłem:

$key = "-----BEGIN PRIVATE KEY-----\nMIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp\nwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5\n1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh\n3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2\npIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX\nGukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il\nAkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF\nL0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k\nX6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl\nU9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ\n37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=\n-----END PRIVATE KEY-----\n"; 

Uwaga podziały wierszy są przekształcone \n, a to wszystko smushed na jednej linii. Jest na to wiele sposobów, ale ... W oparciu o otrzymany błąd może być coś takiego.

-1

zamiast

$key = 'giant_key_goes_here'; 
token = JWT::encode($payload, $key, 'RS256'); 

użycie

define("FIREBASE_PRIVATE_KEY","giant_key_goes_here"); 
token = JWT::encode($payload, FIREBASE_PRIVATE_KEY, 'RS256'); 
+0

można wyjaśnić należy sprawdzić documentation._ twoje rozumowanie - w jaki sposób powstaje coś innego? – KFE

+0

Nie jestem ekspertem od php, dzieląc się tylko tym, jak udało mi się rozwiązać podobny problem z PO. –