5

Sto cercando di impostare autenticazione personalizzato con il nuovo SDK Firebase da Google seguendo tali orientamenti: https://firebase.google.com/docs/auth/server#use_a_jwt_library
Nel codice samble si dice:Impostazione Firebase v3 autenticazione personalizzata con PHP

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

Purtroppo ho non ho idea di dove trovare questo file json. Se vado alla mia console Firebase (https://console.firebase.google.com/), riesco a scaricare un file JSON ma non contiene alcun indirizzo e-mail e chiave privata.

Sono riuscito a trovare un file JSON che contiene un indirizzo e-mail e una chiave privata nella mia console della piattaforma cloud di Google (http://console.cloud.google.com) da goind nel menu "API Manager> Credenziali". Sorprendentemente la mia app Firebase è stata mostrata lì. Copio e incollato l'e-mail e la chiave nel codice di esempio, poi ho avuto questo errore:

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

fa qualcuno ha un'idea di quello che sto facendo male?

Grazie

+0

progetto Un Firebase è "solo" un particolare tipo di progetto Google Cloud Platform, in modo che i progetti Firebase anzi si suppone di presentarsi in Google Cloud Console della piattaforma. Quando crei un account di servizio, consulta il primo paragrafo in [questo link] (https://firebase.google.com/docs/database/server/start#server-sdk-authentication) –

+0

Grazie per la risposta. Ma ancora non funziona. Ha fatto ciò che ha spiegato nel link. Ottengo sempre lo stesso errore. _ (Avviso: openssl_sign(): il parametro chiave fornito non può essere forzato in una chiave privata) _ –

risposta

2

Trovato me stesso cosa c'era che non va! Il codice php di esempio dalla documentazione è bacato. Invece di

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

uso

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

Edit:
In realtà, era solo il codice PHP di esempio da google doc Firebase che era completamente buggy. stava passando una chiave vuota a php-jwt. Sembra che l'abbiano aggiornato oggi e funziona bene :)

+0

È bello sapere che hai riscontrato il problema e grazie per averci segnalato! Aggiungerò una nota che è necessario aggiornare la documentazione. –

+0

C'è anche un errore di sintassi nel codice php di esempio in questa riga: '" claims "=> array ( " premium_account "=> $ is_premium_account ); 'il; deve essere rimosso –

+3

Questo token non sarà assolutamente valido. Google utilizza solo JWT RS256. – foxxtrot

3

Hai trovato la soluzione? Ancora vivendo lo stesso problema! Funziona con HS256 e non con RS256. È un tipo di limitazione di Google Cloud?


Grazie mille! @dbburgess

Problema: stavo usando la chiave sbagliata e l'email. Questi dovrebbero essere generati nella sezione credenziali di Google Cloud che corrisponde al progetto Firebase.

Soluzione:

  • Vai a 'console.cloud.google.com'.
  • Selezionare il progetto Firebase correlato.
  • Quindi "API Manager" -> "Credenziali".
  • 'Crea credenziali' -> 'Chiave account servizio' -> Scegli JSON.
  • Il file creato conterrà il necessario "private_key" & "client_email".

Riempire i valori:

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

non dovrebbe essere necessario cambiare nulla nella funzione "create_custom_token", forse la data di scadenza/ora in base alle proprie esigenze

quindi chiamare la funzione:.

create_custom_token($uid, $is_premium_account); 
+0

Quale funzione è create_custom_token? – user2722667

+0

che ha preso dalla documentazione. – MyUserInStackOverflow

2

Questo è quello che sto facendo, e funziona bene. Quello che fornisci nell'array claims è quello che appare su auth nelle regole di sicurezza. L'e-mail e la chiave provengono dal file json che si ottiene quando si utilizza create a service account (vedere: Prima di iniziare la sezione).

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

Vale la pena notare, il formato sui tasti è un po 'difficile ... La chiave sarà simile a questa (solo una chiave di esempio):

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

Potrebbe essere necessario fare un poco formattazione di fantasia, questo è essenzialmente quello che ho fatto:

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

Nota le interruzioni di riga si trasformano in \n, ed è tutto smushed in una sola riga. Ci sono vari modi per realizzarlo, ma ... In base all'errore che hai ottenuto, qualcosa del genere potrebbe essere il problema.

-1

invece di

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

uso

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

si può spiegare il tuo ragionamento? come fa a produrre qualcosa di diverso? – KFE

+0

Non sono un esperto di php, solo condividendo come sono riuscito a risolvere un problema simile all'OP. –