5

Ich versuche einzurichten benutzerdefinierten Auth mit dem neuen Feuerbasis sdk von Google im Anschluss an diesen Richtlinien auf: https://firebase.google.com/docs/auth/server#use_a_jwt_library
Im samble Code heißt es:Einstellung Feuerbasis v3 benutzerdefinierte Auth mit php

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

Leider I habe keine Ahnung, wo diese JSON-Datei zu bekommen. Wenn ich zu meiner Firebase-Konsole gehe (https://console.firebase.google.com/), kann ich eine JSON-Datei herunterladen, aber sie enthält keine E-Mail-Adresse und keinen privaten Schlüssel.

Ich habe es geschafft, eine JSON-Datei, die eine E-Mail-Adresse und einen privaten Schlüssel in meiner Google Cloud-Plattform-Konsole (http://console.cloud.google.com) enthält, in das Menü "API Manager> Anmeldeinformationen" zu finden. Überraschenderweise wurde meine Firebase App dort gezeigt. Ich kopiere und klebte die E-Mail und Schlüssel in den Beispielcode, dann habe ich diesen Fehler:

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

Hat jemand eine Idee von dem, was ich falsch mache?

Danke

+0

A Firebase-Projekt ist "nur" eine besondere Art von Google Cloud Platform-Projekt, so dass Ihre Firebase in der Tat Projekte sollen in der Google Cloud zeigen Plattformkonsole Informationen zum Erstellen eines Dienstkontos finden Sie im ersten Absatz unter [this link] (https://firebase.google.com/docs/database/server/start#server-sdk-authentication). –

+0

Vielen Dank für Ihre Antwort. Aber immer noch nicht funktioniert. Hat was im Link erklärt. Immer noch der gleiche Fehler. _ (Warnung: openssl_sign(): übergebener Schlüsselparameter kann nicht in einen privaten Schlüssel umgewandelt werden) _ –

Antwort

2

Ich habe mich selbst gefunden, was falsch war! Der Beispiel-PHP-Code aus der Dokumentation ist fehlerhaft. Statt

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

Verwendung

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

Edit:
Eigentlich war es nur die Probe PHP-Code von Google Feuerbasis doc, die vollständig Buggy war. Es wurde ein leerer Schlüssel an php-jwt übergeben. Sieht so aus, als hätten sie es heute aktualisiert und es funktioniert gut :)

+0

Schön zu hören, dass Sie das Problem gefunden haben und danke für Ihre Rückmeldung! Ich füge einen Hinweis hinzu, dass wir die Dokumentation aktualisieren müssen. –

+0

Es gibt auch einen Syntaxfehler in der Beispiel-PHP-Code in dieser Zeile: "" Ansprüche "=> Array ( " premium_account "=> $ is_premium_account ); 'der; sollte entfernt werden –

+3

Dieser Token wird absolut nicht validieren. Google verwendet nur RS256 JWTs. – foxxtrot

3

Haben Sie die Lösung gefunden? Immer noch das gleiche Problem! Funktioniert mit HS256 und nicht mit RS256. Ist es Google Cloud Art der Begrenzung?


Vielen Dank! @dbburgess

Problem: Wurde der falsche Schlüssel und E-Mail verwendet. Diese sollten im Google Cloud-Berechtigungsabschnitt generiert werden, der dem Firebase-Projekt entspricht.

Lösung:

  • Zum 'console.cloud.google.com'.
  • Wählen Sie das zugehörige Firebase-Projekt aus.
  • Dann 'API Manager' -> 'Anmeldeinformationen'.
  • Create Credentials '->' Service Account Key '-> Wählen Sie JSON.
  • Die erstellte Datei enthält den benötigten 'private_key' & 'client_email'.

die Werte geben Sie bitte:

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

Sie sollten nichts in der "create_custom_token" Funktion ändern müssen, vielleicht das Ablaufdatum/Zeit, um Ihre Bedürfnisse nach

dann die Funktion aufrufen.

create_custom_token($uid, $is_premium_account); 
+0

Welche Funktion create_custom_token ist? – user2722667

+0

, die aus der Dokumentation genommen wird. – MyUserInStackOverflow

2

Dies ist, was ich tue, und es funktioniert gut.Was Sie in der claims-Array zur Verfügung stellen, ist, was auf 0 angezeigt wirdin den Sicherheitsregeln. Die E-Mail und der Schlüssel stammen aus der JSON-Datei, die Sie erhalten, wenn Sie create a service account (siehe: Bevor Sie beginnen Abschnitt).

$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'); 

Es ist erwähnenswert, das Format auf der Taste ist ein wenig schwierig ... Ihr Schlüssel wird wie folgt aussehen (nur ein Beispiel key):

-----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----- 

Sie müssen möglicherweise ein tun wenig Phantasie Formatierung, das ist im wesentlichen, was ich getan habe:

$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"; 

Beachten sie die Zeilenumbrüche in \n gedreht, und es wird alles auf eine Zeile smushed. Es gibt verschiedene Möglichkeiten, es zu erreichen, aber ... Basierend auf dem Fehler, den Sie haben, könnte so etwas das Problem sein.

-1

statt

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

Verwendung

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

können Sie erklären, Ihre Argumentation - wie produziert das etwas anderes? – KFE

+0

Ich bin kein PHP-Experte, ich teile nur mit, wie ich ein ähnliches Problem mit dem OP lösen konnte. –