5

Tôi đang cố gắng để thiết lập auth tùy chỉnh với sdk căn cứ hỏa lực mới từ google sau những nguyên tắc này: https://firebase.google.com/docs/auth/server#use_a_jwt_library
Trong mã samble nó nói:Thiết lập căn cứ hỏa lực v3 auth tùy chỉnh với php

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

Đáng tiếc là tôi không biết nơi lấy tập tin json này. Nếu tôi truy cập bảng điều khiển Firebase (https://console.firebase.google.com/), tôi quản lý để không tải tệp json nhưng không chứa bất kỳ địa chỉ email và khóa riêng tư nào.

Tôi đã quản lý để tìm tệp json chứa địa chỉ email và khóa cá nhân trong bảng điều khiển nền tảng đám mây của Google (http://console.cloud.google.com) bằng cách đi tới trình đơn "Trình quản lý API> Chứng chỉ". Đáng ngạc nhiên là ứng dụng firebase của tôi đã được hiển thị ở đó. Tôi sao chép và dán email và nhập mã mẫu, sau đó tôi nhận được lỗi này:

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

Có ai có ý tưởng về việc tôi đang làm sai không?

Cảm ơn

+0

dự án Một căn cứ hỏa lực được "chỉ là" một kiểu đặc biệt của dự án Google Cloud Platform, vì vậy các dự án căn cứ hỏa lực của bạn thực sự có nghĩa vụ phải hiển thị trong Google Cloud Bảng điều khiển nền tảng. Khi tạo tài khoản dịch vụ, hãy xem đoạn đầu tiên trong [liên kết này] (https://firebase.google.com/docs/database/server/start#server-sdk-authentication) –

+0

Cảm ơn câu trả lời của bạn. Nhưng vẫn không hoạt động. Đã làm những gì được giải thích trong liên kết. Vẫn nhận được cùng một lỗi. _ (Cảnh báo: openssl_sign(): thông số khóa được cung cấp không thể bị ép buộc vào khóa riêng) _ –

Trả lời

2

Tìm thấy chính bản thân tôi đã xảy ra lỗi! Mã mẫu php từ tài liệu bị lỗi. Thay vì

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

sử dụng

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

Edit:
Trên thực tế, đó chỉ là mã php mẫu từ google doc căn cứ hỏa lực đó là hoàn toàn lỗi. nó đã đi qua một khóa rỗng để php-jwt. Có vẻ như họ đã cập nhật ngày hôm nay và nó hoạt động tốt :)

+0

Thật tuyệt khi biết rằng bạn đã tìm thấy sự cố và cảm ơn bạn đã báo cáo lại! Tôi sẽ thêm một lưu ý rằng chúng ta cần cập nhật tài liệu. –

+0

Ngoài ra còn có một lỗi cú pháp trong mã php mẫu trong dòng này: '" claim "=> mảng ( " premium_account "=> $ is_premium_account ); 'the; nên được loại bỏ –

+3

Mã thông báo này sẽ hoàn toàn không xác nhận. Google chỉ sử dụng RS256 JWT. – foxxtrot

3

Bạn đã tìm ra giải pháp chưa? Vẫn gặp sự cố tương tự! Làm việc với HS256 và không có RS256. Có phải loại đám mây giới hạn của Google không?


Cảm ơn bạn rất nhiều! @dbburgess

Sự cố: Đã sử dụng sai khóa và email. Chúng sẽ được tạo trong phần thông tin đăng nhập Google Cloud tương ứng với dự án Firebase.

Giải pháp:

  • Đến 'console.cloud.google.com'.
  • Chọn dự án Firebase có liên quan.
  • Sau đó, 'Trình quản lý API' -> 'Thông tin xác thực'.
  • 'Tạo thông tin xác thực' -> 'Khóa tài khoản dịch vụ' -> Chọn JSON.
  • Tệp được tạo sẽ chứa 'private_key' cần thiết & 'client_email'.

Điền các giá trị:

$ service_account_email = "[email protected] "; $ private_key =" ----- BEGIN KHÓA RIÊNG TƯ ----- \ nSoneVeryVeryLongKey = \ n ----- KẾT THÚC RIÊNG TƯ ----- \ n "; $ uid = 'UserToUseInFirebaseRules' ; $ is_premium_account = $ uid;

bạn không nên cần phải thay đổi bất cứ điều gì trong hàm "create_custom_token", có lẽ ngày hết hạn/thời hạn theo yêu cầu của bạn

Sau đó gọi hàm:.

create_custom_token($uid, $is_premium_account); 
+0

Chức năng nào là create_custom_token? – user2722667

+0

Được lấy từ tài liệu. – MyUserInStackOverflow

2

Đây là những gì tôi đang làm và nó hoạt động tốt. Những gì bạn cung cấp trong mảng claims là những gì hiển thị trên auth trong các quy tắc bảo mật. Email và khóa đến từ tệp json bạn nhận được khi bạn create a service account (xem: Trước khi bạn bắt đầu phần).

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

Nó đáng chú ý, định dạng trên các phím là một chút khó khăn ... chìa khóa của bạn sẽ giống như thế này (chỉ là một chìa khóa chẳng hạn):

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

Bạn có thể cần phải làm một ít định dạng ưa thích, điều này về cơ bản là những gì tôi đã làm:

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

Lưu ý ngắt dòng được biến thành \n, và nó là tất cả bẩn lem nhem vào một dòng. Có nhiều cách khác nhau để hoàn thành nó, nhưng ... Dựa trên lỗi bạn nhận được, một cái gì đó như thế này có thể là vấn đề.

-1

thay vì

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

sử dụng

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

bạn có thể giải thích – KFE

+0

Tôi không phải là chuyên gia về php, chỉ chia sẻ cách tôi quản lý để giải quyết một vấn đề tương tự với OP. –

Các vấn đề liên quan