Firebase PHP JWT «OpenSSL не удалось проверить данные: ошибка: 0906D06C: подпрограммы PEM: PEM_read_bio: нет начальной строки»

#php #firebase #jwt #firebase-authentication

#php #firebase #jwt #firebase-аутентификация

Вопрос:

Я использую Google Cloud PHP API через App Engine. С клиентского устройства отправляется запрос через POST с токеном аутентификации Firebase. Согласно документации Firebase PHP JWT, я пытаюсь декодировать токен с помощью этого кода:

 $decoded = JWT::decode($token, $key, array('RS256'));
  

$token — это строка, подобная (это недопустимо по соображениям безопасности):

 eyJhbGciOiJSUzI1asdaNiIsImtpZCI6Ijk2N2Q3NzQ4YmM5NTMTIzNzRhZWQasdasd3MzEyYzcwNjEyZTRlNTM4NmUifQ.tuaAsjdlkjvsdngeoijAnlnbfgLkoosdfKLnm,werkldsfNkndfkdsnfkfnlNKL2i34nkNJioj4Kkoj234j%jij1kjojsdffds98giojerNNjasndasiNjasdnJAjnasdkjnFoFjoFJOIAASD8990adsaaDknnkngs.v_Ko6HZjrahbihLbw2Bm7EuslEC2SSHXNK79rDbD9qIIVYxPjCsubsdfkyAWDIoJHwjkM9TtssYS-1Cjd_xkXghfILuDZpzLsHV6rF20J4n3eUTrsnmLDHK6UB5N3yK2LYoF1UoFrsiyWenfqELfE4Gx5wlfmsylTS1foS2CWRrT1ccqmJBinWiY6JNUS-0gg-2Aecf_VJ63RD9308sBKy1DUsBeje9yG8w2YpYsAqKIlMTC-FqLLpHlKe4LZxcveiqSF4J6PgvcLSPTMmg7-Li_8m41O-wfU1zwSpS1SJ73RJNg-kvRZ1y1ll8ExqXjZkazRDVkYVo6yu5AXi1Onl6FqBLA
  

Проверка токена с помощью JWT.io передаст мне правильную полезную нагрузку.

Теперь для части $key. Я загрузил JSON-файл учетной записи службы по умолчанию из консоли Google API. Если я использую «private_key», который выглядит как:

 -----BEGIN PRIVATE KEY-----n[VERY_LONG_PRIVATE_KEY]n-----END PRIVATE KEY-----n
  

Я получаю эту ошибку:

 openssl_verify(): supplied key param cannot be coerced into a public key
  

Я нашел ответ здесь, в StackOverflow, что это может быть использовано для преобразования закрытого ключа в открытый ключ:

 $private_key = openssl_pkey_get_private($c->serviceAccount->private_key);
$details = openssl_pkey_get_details($private_key);
$public_key = $details['key']
  

Поэтому, если я использую вместо этого $public_key, я получаю другую ошибку, в которой указано следующее:

 Uncaught exception 'DomainException' with message 'OpenSSL unable to verify data: error:0906D06C:PEM routines:PEM_read_bio:no start line
  

Открытый ключ выглядит так:

 -----BEGIN PUBLIC KEY-----n[VERY_LONG_KEY]n-----END PUBLIC KEY-----n
  

Похоже, это должно сработать. Но это не так. Алгоритм RS256 также является правильным.

Любая помощь приветствуется!

Ответ №1:

Я столкнулся с той же ошибкой при чтении моего закрытого ключа с помощью Node.js
Error: error:0906D06C:PEM routines:PEM_read_bio:no start line

Оказалось, что проблемы заключались в том, что Google Cloud конвертировался n в \n . Когда я преобразовал его обратно n , он сработал.

 const functions = require('firebase-functions');
const admin = require('firebase-admin');
const bigquery = require('@google-cloud/bigquery');

const config = functions.config();
admin.initializeApp(config.firebase);
const firestore = admin.firestore();

const sanitizePrivateKey = (key) =>
  key.replace(/\n/g, 'n');

/* firebase converts n to \n, we have to convert it back */
if (config.credentials) {
  config.credentials.private_key = sanitizePrivateKey(config.credentials.private_key);
}

const bigqueryClient = bigquery({
  projectId: 'screencastify-staging',
  // eslint-disable-next-line
  credentials: config.credentials,
});