5

我試圖設置自定義身份驗證與谷歌以下這些準則的新火力SDK:https://firebase.google.com/docs/auth/server#use_a_jwt_library
在samble代碼,它說:設置火力V3的定製身份驗證使用PHP

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

不幸的是我不知道從哪裏得到這個json文件。如果我轉到我的Firebase控制檯(https://console.firebase.google.com/),我設法阻止了一個json文件,但它不包含任何電子郵件地址和私鑰。

通過goind進入「API Manager> Credentials」菜單,我設法在我的Google雲平臺控制檯(http://console.cloud.google.com)中找到包含電子郵件地址和私鑰的json文件。令人驚訝的是,我的Firebase應用程序在那裏展示。我複製並粘貼電子郵件和鑰匙插入示例代碼,然後我得到這個錯誤:

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

是否有人有什麼,我做錯了的想法?

謝謝

+0

一個火力地堡計劃「只是」一個特殊類型的谷歌雲平臺項目,讓您的火力地堡項目確實應該在谷歌雲露面平臺控制檯。有關創建服務帳戶的信息,請參閱[此鏈接]中的第一段(https://firebase.google.com/docs/database/server/start#server-sdk-authentication) –

+0

感謝您的回答。但仍然沒有工作。鏈接中解釋了什麼?仍然得到相同的錯誤。 _(警告:openssl_sign():提供的密鑰參數不能強制爲私鑰)_ –

回答

2

發現我自己什麼是錯的! 文檔中的示例php代碼是buggy。取而代之的

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

使用

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

編輯:
其實,這是剛剛從谷歌文檔火力樣本PHP代碼,這是完全馬車。它傳遞一個空的密鑰到php-jwt。看起來他們今天更新它,它的工作正常:)

+0

很高興聽到您發現問題並感謝您報告回!我會添加一條說明,我們需要更新文檔。 –

+0

在這一行的示例php代碼中也有一個語法錯誤:'「claims」=> array( 「premium_account」=> $ is_premium_account ); ';應該被刪除 –

+3

這個令牌絕對不會被驗證。 Google僅使用RS256智威湯遜。 – foxxtrot

3

您是否找到解決方案?仍然遇到同樣的問題!適用於HS256,不適用於RS256。它是谷歌雲類的限制嗎?


非常感謝! @dbburgess

問題:使用了錯誤的密鑰和電子郵件。這些應該在與Firebase項目相對應的Google Cloud憑據部分中生成。

解決方案:

  • 去 'console.cloud.google.com'。
  • 選擇相關的Firebase項目。
  • 然後'API Manager' - >'Credentials'。
  • '創建憑證' - >'服務賬戶密鑰' - >選擇JSON。
  • 創建的文件將包含所需的'private_key'&'client_email'。

填充值:

$ SERVICE_ACCOUNT_EMAIL =「[email protected]。com「; $ private_key =」----- BEGIN PRIVATE KEY ----- \ nSoneVeryVeryLongKey = \ n ----- END PRIVATE KEY ----- \ n「; $ uid ='UserToUseInFirebaseRules' ; $ is_premium_account = $ UID;

你不應該需要根據自己的需要改變什麼,在「create_custom_token」功能,或許到期日期/時間

然後調用函數:

create_custom_token($uid, $is_premium_account); 
+0

是create_custom_token什麼功能? – user2722667

+0

這是從文檔服用。 – MyUserInStackOverflow

2

這是我正在做的,它工作正常。您在claims陣列中提供的是什麼顯示在0安全規則中的。電子郵件和密鑰來自您獲得的json文件,當您create a service account(請參閱:開始之前部分)。

$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,它是所有smushed到一行。有很多方法可以完成它,但是......基於你得到的錯誤,這樣的事情可能是問題所在。

-1

代替

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

你能解釋一下時,請參閱documentation._你的推理?這是怎麼產生不同的東西? – KFE

+0

我不是PHP的專家,只分享我如何設法解決與OP類似的問題。 –

相關問題