Настройка firebase v3 custom auth с php

Я пытаюсь настроить пользовательский auth с помощью нового firebase sdk из Google, следуя этим рекомендациям: https://firebase.google.com/docs/auth/server#use_a_jwt_library
В коде samble говорится:

Получите свой адрес электронной почты и закрытый ключ своей учетной записи из файла ключа JSON

К сожалению, я не знаю, где взять этот json-файл. Если я перейду на консоль firebase ( https://console.firebase.google.com/ ), мне удастся загрузить json-файл, но он не содержит адрес электронной почты и закрытый ключ.

Мне удалось найти json-файл, содержащий адрес электронной почты и закрытый ключ в консоли Google Cloud Cloud ( http://console.cloud.google.com ), заглянув в меню «Диспетчер API»> «Учетные данные». Удивительно, но там было показано мое приложение для firebase. Я копирую и вставляю адрес электронной почты и ключ в код примера, затем я получил эту ошибку:

Предупреждение: openssl_sign (): указанный ключевой параметр не может быть принудительно введен в закрытый ключ в /volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php в строке 183. Неустранимая ошибка: исключить исключение «ExceptionException »с сообщением «OpenSSL не может подписать данные» в /volume1/web/yeti/vendor/firebase/php-jwt/src/JWT.php:185 Трассировка стека: # 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} throw in / volume1 / web / Yeti / vendor / firebase / php-jwt / src / JWT.php в строке 185

Кто-то имеет представление о том, что я делаю неправильно?

благодаря

Solutions Collecting From Web of "Настройка firebase v3 custom auth с php"

Вы нашли решение? Все еще испытывает ту же проблему! Работает с HS256 и не с RS256. Является ли это облачным ограничением?


Спасибо огромное ! @dbburgess

Проблема: использовал неправильный ключ и электронную почту. Они должны быть сгенерированы в разделе учетных данных Google Cloud, соответствующих проекту Firebase.

Решение:

  • Перейдите на страницу «console.cloud.google.com».
  • Выберите соответствующий проект Firebase.
  • Затем «Менеджер API» -> «Учетные данные».
  • «Создать учетные данные» -> «Ключ учетной записи службы» -> Выберите JSON.
  • Созданный файл будет содержать необходимую «private_key» и «client_email».

Заполните значения:

$ service_account_email = "autogeneratedemail@developer.gserviceaccount.com"; $ private_key = "—– НАЧАТЬ ЧАСТНЫЙ КЛЮЧ —– \ nSoneVeryVeryLongKey = \ n —– END ЧАСТНЫЙ КЛЮЧ —– \ n"; $ uid = 'UserToUseInFirebaseRules'; $ is_premium_account = $ uid;

Вам не нужно ничего менять в функции «create_custom_token», возможно, время / время истечения в соответствии с вашими потребностями.

Затем вызовите функцию:

create_custom_token($uid, $is_premium_account); 

Нашел себя, что было не так! Образец php-кода из документации не работает. Вместо

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

использование

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

Редактировать :
На самом деле, это был всего лишь пример кода php из документа google firebase, который был полностью неисправен. он передавал пустой ключ в php-jwt. Похоже, они обновили его сегодня, и он отлично работает 🙂

Это то, что я делаю, и все отлично. То, что вы предоставили в массиве claims – это то, что отображается в auth в правилах безопасности. Электронная почта и ключ поступают из json-файла, который вы получаете при создании учетной записи службы (см. Раздел « Перед началом работы »).

 $userId = '1234'; $email = 'sample@email.com'; $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'); 

Стоит отметить, что формат на клавишах немного сложный … Ваш ключ будет выглядеть примерно так (только примерный ключ):

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

Возможно, вам придется сделать небольшое причудливое форматирование, это, по сути, то, что я сделал:

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

Обратите внимание, что разрывы строк превращаются в \n , и все они удаляются в одну строку. Существуют различные способы его решения, но … Основываясь на полученной вами ошибке, может возникнуть проблема с этим.

вместо

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

использование

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