fork download
  1. <?php
  2.  
  3. $serviceAccount = [
  4. "type" => "service_account",
  5. "project_id" => "chakra-mobile-notification",
  6. "private_key_id" => "b16821d855c22f46ff2bede2f6d57765108c683b",
  7. "private_key" => <<<EOD
  8. -----BEGIN PRIVATE KEY-----
  9. MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCqMm8oCmr+TLPq
  10. 48qE5R4jerX7CAaA/kFqB5baZTps0hNW8M7RvCAefCbC7FmbLqBT0jy406dYP2A+
  11. tZbGEoY5cucswj4eOn3ojo6aPSF7i1fjsW2nF659PGOwqwrvdxu5HVYiCt9VUgh3
  12. GUDpmxcQnwhK9J3HibsNTqQ1kTNK6jrca4Di4+MZMtlx0qqsaTao/W+KTppexlwe
  13. /hDbBrfGVKv4F4SohJcvGUCcHHiqQT9zwhn0/uacdNdKXyddjzaALWWzv3OoDktH
  14. t9fHjOBU9JwT4heBvFRCmNLE6HkdEmWIgduiMxdt8BnMFT46Djnomc2UqOHTfIJV
  15. TD1lQJhnAgMBAAECggEAKzOlIpFOamGW8+NBh21PMqtV4TQ+zmR7v0nQ4Xv7kh7b
  16. GOEEZpmtv389KZJsBmeV++DsV/Al1NE1gYV/kaSnHJMNmj9uHCc1yZ/SE9W7l4wd
  17. 0aa6kkUBHjoDhhdMrc9aoqkPMZH38cTicDThVMrw1l+/76LbIAjWicCyDwTd88BJ
  18. /F93xfuRXIkJvHPLtilbsDMH28FHKrqbU/fpxSRNQ6GvXAkNL6NlSymeoD6+gL87
  19. k20t20hrwGpho5PdD5U4OQNwNosPcT8vff/uZY/vjWjWsctBLp8pfW3Ema860Uo6
  20. TCObL15eBcZ4ObamH1ej01FekH8eT10SfVExZPazUQKBgQDa9VCoQOf5Mc2mQGCE
  21. KAjM9YrRa09uKwRnkE5smtYbgYCIvno4HyKepXzxASToIEhEJ1dty/+EUJDsDG17
  22. 8SfqHpNZVlN321gPJ1hIr8rnL2v2dR3fBjcLFIJumWJelXKima+t6OjaXIBSRi4R
  23. t9YLfE3qaTU0Jhck3EsrzQ6ukQKBgQDG/VuVpWsNx/79wXoG6MGsGkekw7813cDU
  24. v2NLUXKBsYcvp+JUYcs3OwOE4Cwg/GB3WFDkVmPlLjYEZztpF0irhM8NLFHYkey8
  25. /T3rseL3Cm2ZfeWXcNvOuun0q95tb79oOc3nOmqaUmh+J3yzkYMJlzR9lTFq1iHB
  26. vW100aXDdwKBgC1XLTuaLS8iDAbIP/Q94gynL/bLtOgISmIztLmymnGZsIcggmiK
  27. sf2OIUA6z2yt+qj6SJV479FzaX8n16gZuP03FaYjRSeFqUeCCzsKBAc5f67Kc8QS
  28. ImXN+nBynLcfVVysXH+zwjwteXkQBUwv+Efqlqva22SQGqzMXViVntuxAoGAczlw
  29. F+YyaEd/yvaGr4uF4h9RjwHeLdXbfBXa7FkcQidHTXwcXZpHLxMYBZA9XVhmj5Tv
  30. Olkf/SxWERSp3T+jT9ZWgp1AQ3S0LfdCLMHT2BMMxc2V7axnS30GTixbXulPX43h
  31. QdycsAG6ChrZZa2DwEDzHykN9XxLDcGfqP5gyx8CgYBwXjhTbgYz1fHXKELBSfun
  32. nx0fWh0AHEcYyXSsfNJdIFxQlxyvOO50FLWYr/i3HgmoEMYSSSbxuqwBE27LxlsH
  33. OA0N/x+MezNFfFYN3h7xkdGuQUpqEulNsqx/FiEOjmcRFJva3f2N43fYiqPDb/DL
  34. FlpWjDaf1eO47lSA2jlzgg==
  35. -----END PRIVATE KEY-----
  36. EOD,
  37. "client_email" => "firebase-adminsdk-fbsvc@chakra-mobile-notification.iam.gserviceaccount.com",
  38. "token_uri" => "https://o...content-available-to-author-only...s.com/token"
  39. ];
  40.  
  41. function base64url_encode($data) {
  42. return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  43. }
  44.  
  45. // 1. Create JWT
  46. $now = time();
  47. $jwtHeader = ['alg' => 'RS256', 'typ' => 'JWT'];
  48. $jwtPayload = [
  49. "iss" => $serviceAccount['client_email'],
  50. "scope" => "https://w...content-available-to-author-only...s.com/auth/firebase.messaging",
  51. "aud" => $serviceAccount['token_uri'],
  52. "iat" => $now,
  53. "exp" => $now + 3600
  54. ];
  55.  
  56. $jwtHeaderEncoded = base64url_encode(json_encode($jwtHeader));
  57. $jwtPayloadEncoded = base64url_encode(json_encode($jwtPayload));
  58. $unsignedJWT = $jwtHeaderEncoded . '.' . $jwtPayloadEncoded;
  59.  
  60. openssl_sign($unsignedJWT, $signature, $serviceAccount['private_key'], 'sha256');
  61. $jwtSignatureEncoded = base64url_encode($signature);
  62. $jwt = $unsignedJWT . '.' . $jwtSignatureEncoded;
  63.  
  64. // 2. Send to Google OAuth
  65. $tokenRequest = [
  66. 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
  67. 'assertion' => $jwt
  68. ];
  69.  
  70. $ch = curl_init();
  71. curl_setopt($ch, CURLOPT_URL, $serviceAccount['token_uri']);
  72. curl_setopt($ch, CURLOPT_POST, true);
  73. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($tokenRequest));
  74. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  75. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  76. 'Content-Type: application/x-www-form-urlencoded'
  77. ]);
  78.  
  79. $response = curl_exec($ch);
  80.  
  81. // 3. Print response
  82. header('Content-Type: application/json');
  83. echo $response;
  84.  
Success #stdin #stdout 0.03s 26348KB
stdin
Standard input is empty
stdout
Standard output is empty