Настройка FireBase v3 Custom 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 (http://console.cloud.google.com) перейдите в меню «Диспетчер API> Учетные данные». Удивительно, но мое приложение Firebase было показано там. Я скопировал и вставил письмо и ключ в пример кода, затем я получил эту ошибку:

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

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

Спасибо

7

Решение

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


Спасибо вам большое ! @dbburgess

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

Решение:

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

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

$ service_account_email = «[email protected]»;
$ private_key = «—— НАЧАТЬ ЧАСТНЫЙ КЛЮЧ —— \ nSoneVeryVeryLongKey = \ n —— КОНЕЦ ЧАСТНОГО КЛЮЧА —— \ n»;
$ uid = ‘UserToUseInFirebaseRules’;
$ is_premium_account = $ uid;

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

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

create_custom_token($uid, $is_premium_account);
7

Другие решения

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

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

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

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

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

4

Это то, что я делаю, и это отлично работает. Что вы предоставляете в claims массив это то, что обнаруживается на auth в правилах безопасности. Электронный адрес и ключ приходят из файла json, который вы получаете, когда вы создать учетную запись службы (увидеть: Прежде чем вы начнете раздел).

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

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

-----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, и все это сокрушено в одну линию. Есть разные способы сделать это, но … Судя по полученной ошибке, проблема может быть в чем-то подобном.

3

вместо

$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');
-1
По вопросам рекламы [email protected]