<?php
$serviceAccount = [
"type" => "service_account",
"project_id" => "chakra-mobile-notification",
"private_key_id" => "b16821d855c22f46ff2bede2f6d57765108c683b",
"private_key" => <<<EOD
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCqMm8oCmr+TLPq
48qE5R4jerX7CAaA/kFqB5baZTps0hNW8M7RvCAefCbC7FmbLqBT0jy406dYP2A+
tZbGEoY5cucswj4eOn3ojo6aPSF7i1fjsW2nF659PGOwqwrvdxu5HVYiCt9VUgh3
GUDpmxcQnwhK9J3HibsNTqQ1kTNK6jrca4Di4+MZMtlx0qqsaTao/W+KTppexlwe
/hDbBrfGVKv4F4SohJcvGUCcHHiqQT9zwhn0/uacdNdKXyddjzaALWWzv3OoDktH
t9fHjOBU9JwT4heBvFRCmNLE6HkdEmWIgduiMxdt8BnMFT46Djnomc2UqOHTfIJV
TD1lQJhnAgMBAAECggEAKzOlIpFOamGW8+NBh21PMqtV4TQ+zmR7v0nQ4Xv7kh7b
GOEEZpmtv389KZJsBmeV++DsV/Al1NE1gYV/kaSnHJMNmj9uHCc1yZ/SE9W7l4wd
0aa6kkUBHjoDhhdMrc9aoqkPMZH38cTicDThVMrw1l+/76LbIAjWicCyDwTd88BJ
/F93xfuRXIkJvHPLtilbsDMH28FHKrqbU/fpxSRNQ6GvXAkNL6NlSymeoD6+gL87
k20t20hrwGpho5PdD5U4OQNwNosPcT8vff/uZY/vjWjWsctBLp8pfW3Ema860Uo6
TCObL15eBcZ4ObamH1ej01FekH8eT10SfVExZPazUQKBgQDa9VCoQOf5Mc2mQGCE
KAjM9YrRa09uKwRnkE5smtYbgYCIvno4HyKepXzxASToIEhEJ1dty/+EUJDsDG17
8SfqHpNZVlN321gPJ1hIr8rnL2v2dR3fBjcLFIJumWJelXKima+t6OjaXIBSRi4R
t9YLfE3qaTU0Jhck3EsrzQ6ukQKBgQDG/VuVpWsNx/79wXoG6MGsGkekw7813cDU
v2NLUXKBsYcvp+JUYcs3OwOE4Cwg/GB3WFDkVmPlLjYEZztpF0irhM8NLFHYkey8
/T3rseL3Cm2ZfeWXcNvOuun0q95tb79oOc3nOmqaUmh+J3yzkYMJlzR9lTFq1iHB
vW100aXDdwKBgC1XLTuaLS8iDAbIP/Q94gynL/bLtOgISmIztLmymnGZsIcggmiK
sf2OIUA6z2yt+qj6SJV479FzaX8n16gZuP03FaYjRSeFqUeCCzsKBAc5f67Kc8QS
ImXN+nBynLcfVVysXH+zwjwteXkQBUwv+Efqlqva22SQGqzMXViVntuxAoGAczlw
F+YyaEd/yvaGr4uF4h9RjwHeLdXbfBXa7FkcQidHTXwcXZpHLxMYBZA9XVhmj5Tv
Olkf/SxWERSp3T+jT9ZWgp1AQ3S0LfdCLMHT2BMMxc2V7axnS30GTixbXulPX43h
QdycsAG6ChrZZa2DwEDzHykN9XxLDcGfqP5gyx8CgYBwXjhTbgYz1fHXKELBSfun
nx0fWh0AHEcYyXSsfNJdIFxQlxyvOO50FLWYr/i3HgmoEMYSSSbxuqwBE27LxlsH
OA0N/x+MezNFfFYN3h7xkdGuQUpqEulNsqx/FiEOjmcRFJva3f2N43fYiqPDb/DL
FlpWjDaf1eO47lSA2jlzgg==
-----END PRIVATE KEY-----
EOD,
"client_email" => "firebase-adminsdk-fbsvc@chakra-mobile-notification.iam.gserviceaccount.com",
"token_uri" => "https://o...content-available-to-author-only...s.com/token"
];
function base64url_encode($data) {
}
// 1. Create JWT
$jwtHeader = ['alg' => 'RS256', 'typ' => 'JWT'];
$jwtPayload = [
"iss" => $serviceAccount['client_email'],
"scope" => "https://w...content-available-to-author-only...s.com/auth/firebase.messaging",
"aud" => $serviceAccount['token_uri'],
"iat" => $now,
"exp" => $now + 3600
];
$jwtHeaderEncoded = base64url_encode
(json_encode($jwtHeader)); $jwtPayloadEncoded = base64url_encode
(json_encode($jwtPayload)); $unsignedJWT = $jwtHeaderEncoded . '.' . $jwtPayloadEncoded;
openssl_sign($unsignedJWT, $signature, $serviceAccount['private_key'], 'sha256'); $jwtSignatureEncoded = base64url_encode($signature);
$jwt = $unsignedJWT . '.' . $jwtSignatureEncoded;
// 2. Send to Google OAuth
$tokenRequest = [
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion' => $jwt
];
curl_setopt($ch, CURLOPT_URL
, $serviceAccount['token_uri']); 'Content-Type: application/x-www-form-urlencoded'
]);
// 3. Print response
header('Content-Type: application/json'); echo $response;
PD9waHAKCiRzZXJ2aWNlQWNjb3VudCA9IFsKICAgICJ0eXBlIiA9PiAic2VydmljZV9hY2NvdW50IiwKICAgICJwcm9qZWN0X2lkIiA9PiAiY2hha3JhLW1vYmlsZS1ub3RpZmljYXRpb24iLAogICAgInByaXZhdGVfa2V5X2lkIiA9PiAiYjE2ODIxZDg1NWMyMmY0NmZmMmJlZGUyZjZkNTc3NjUxMDhjNjgzYiIsCiAgICAicHJpdmF0ZV9rZXkiID0+IDw8PEVPRAotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcU1tOG9DbXIrVExQcQo0OHFFNVI0amVyWDdDQWFBL2tGcUI1YmFaVHBzMGhOVzhNN1J2Q0FlZkNiQzdGbWJMcUJUMGp5NDA2ZFlQMkErCnRaYkdFb1k1Y3Vjc3dqNGVPbjNvam82YVBTRjdpMWZqc1cybkY2NTlQR093cXdydmR4dTVIVllpQ3Q5VlVnaDMKR1VEcG14Y1Fud2hLOUozSGlic05UcVExa1ROSzZqcmNhNERpNCtNWk10bHgwcXFzYVRhby9XK0tUcHBleGx3ZQovaERiQnJmR1ZLdjRGNFNvaEpjdkdVQ2NISGlxUVQ5endobjAvdWFjZE5kS1h5ZGRqemFBTFdXenYzT29Ea3RICnQ5ZkhqT0JVOUp3VDRoZUJ2RlJDbU5MRTZIa2RFbVdJZ2R1aU14ZHQ4Qm5NRlQ0NkRqbm9tYzJVcU9IVGZJSlYKVEQxbFFKaG5BZ01CQUFFQ2dnRUFLek9sSXBGT2FtR1c4K05CaDIxUE1xdFY0VFErem1SN3YwblE0WHY3a2g3YgpHT0VFWnBtdHYzODlLWkpzQm1lVisrRHNWL0FsMU5FMWdZVi9rYVNuSEpNTm1qOXVIQ2MxeVovU0U5VzdsNHdkCjBhYTZra1VCSGpvRGhoZE1yYzlhb3FrUE1aSDM4Y1RpY0RUaFZNcncxbCsvNzZMYklBaldpY0N5RHdUZDg4QkoKL0Y5M3hmdVJYSWtKdkhQTHRpbGJzRE1IMjhGSEtycWJVL2ZweFNSTlE2R3ZYQWtOTDZObFN5bWVvRDYrZ0w4NwprMjB0MjBocndHcGhvNVBkRDVVNE9RTndOb3NQY1Q4dmZmL3VaWS92aldqV3NjdEJMcDhwZlczRW1hODYwVW82ClRDT2JMMTVlQmNaNE9iYW1IMWVqMDFGZWtIOGVUMTBTZlZFeFpQYXpVUUtCZ1FEYTlWQ29RT2Y1TWMybVFHQ0UKS0FqTTlZclJhMDl1S3dSbmtFNXNtdFliZ1lDSXZubzRIeUtlcFh6eEFTVG9JRWhFSjFkdHkvK0VVSkRzREcxNwo4U2ZxSHBOWlZsTjMyMWdQSjFoSXI4cm5MMnYyZFIzZkJqY0xGSUp1bVdKZWxYS2ltYSt0Nk9qYVhJQlNSaTRSCnQ5WUxmRTNxYVRVMEpoY2szRXNyelE2dWtRS0JnUURHL1Z1VnBXc054Lzc5d1hvRzZNR3NHa2Vrdzc4MTNjRFUKdjJOTFVYS0JzWWN2cCtKVVljczNPd09FNEN3Zy9HQjNXRkRrVm1QbExqWUVaenRwRjBpcmhNOE5MRkhZa2V5OAovVDNyc2VMM0NtMlpmZVdYY052T3V1bjBxOTV0Yjc5b09jM25PbXFhVW1oK0ozeXprWU1KbHpSOWxURnExaUhCCnZXMTAwYVhEZHdLQmdDMVhMVHVhTFM4aURBYklQL1E5NGd5bkwvYkx0T2dJU21JenRMbXltbkdac0ljZ2dtaUsKc2YyT0lVQTZ6Mnl0K3FqNlNKVjQ3OUZ6YVg4bjE2Z1p1UDAzRmFZalJTZUZxVWVDQ3pzS0JBYzVmNjdLYzhRUwpJbVhOK25CeW5MY2ZWVnlzWEgrendqd3RlWGtRQlV3ditFZnFscXZhMjJTUUdxek1YVmlWbnR1eEFvR0Fjemx3CkYrWXlhRWQveXZhR3I0dUY0aDlSandIZUxkWGJmQlhhN0ZrY1FpZEhUWHdjWFpwSEx4TVlCWkE5WFZobWo1VHYKT2xrZi9TeFdFUlNwM1QralQ5WldncDFBUTNTMExmZENMTUhUMkJNTXhjMlY3YXhuUzMwR1RpeGJYdWxQWDQzaApRZHljc0FHNkNoclpaYTJEd0VEekh5a045WHhMRGNHZnFQNWd5eDhDZ1lCd1hqaFRiZ1l6MWZIWEtFTEJTZnVuCm54MGZXaDBBSEVjWXlYU3NmTkpkSUZ4UWx4eXZPTzUwRkxXWXIvaTNIZ21vRU1ZU1NTYnh1cXdCRTI3THhsc0gKT0EwTi94K01lek5GZkZZTjNoN3hrZEd1UVVwcUV1bE5zcXgvRmlFT2ptY1JGSnZhM2YyTjQzZllpcVBEYi9ETApGbHBXakRhZjFlTzQ3bFNBMmpsemdnPT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpFT0QsCiAgICAiY2xpZW50X2VtYWlsIiA9PiAiZmlyZWJhc2UtYWRtaW5zZGstZmJzdmNAY2hha3JhLW1vYmlsZS1ub3RpZmljYXRpb24uaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLAogICAgInRva2VuX3VyaSIgPT4gImh0dHBzOi8vby4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20vdG9rZW4iCl07CgpmdW5jdGlvbiBiYXNlNjR1cmxfZW5jb2RlKCRkYXRhKSB7CiAgICByZXR1cm4gcnRyaW0oc3RydHIoYmFzZTY0X2VuY29kZSgkZGF0YSksICcrLycsICctXycpLCAnPScpOwp9CgovLyAxLiBDcmVhdGUgSldUCiRub3cgPSB0aW1lKCk7CiRqd3RIZWFkZXIgPSBbJ2FsZycgPT4gJ1JTMjU2JywgJ3R5cCcgPT4gJ0pXVCddOwokand0UGF5bG9hZCA9IFsKICAgICJpc3MiID0+ICRzZXJ2aWNlQWNjb3VudFsnY2xpZW50X2VtYWlsJ10sCiAgICAic2NvcGUiID0+ICJodHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tL2F1dGgvZmlyZWJhc2UubWVzc2FnaW5nIiwKICAgICJhdWQiID0+ICRzZXJ2aWNlQWNjb3VudFsndG9rZW5fdXJpJ10sCiAgICAiaWF0IiA9PiAkbm93LAogICAgImV4cCIgPT4gJG5vdyArIDM2MDAKXTsKCiRqd3RIZWFkZXJFbmNvZGVkID0gYmFzZTY0dXJsX2VuY29kZShqc29uX2VuY29kZSgkand0SGVhZGVyKSk7CiRqd3RQYXlsb2FkRW5jb2RlZCA9IGJhc2U2NHVybF9lbmNvZGUoanNvbl9lbmNvZGUoJGp3dFBheWxvYWQpKTsKJHVuc2lnbmVkSldUID0gJGp3dEhlYWRlckVuY29kZWQgLiAnLicgLiAkand0UGF5bG9hZEVuY29kZWQ7CgpvcGVuc3NsX3NpZ24oJHVuc2lnbmVkSldULCAkc2lnbmF0dXJlLCAkc2VydmljZUFjY291bnRbJ3ByaXZhdGVfa2V5J10sICdzaGEyNTYnKTsKJGp3dFNpZ25hdHVyZUVuY29kZWQgPSBiYXNlNjR1cmxfZW5jb2RlKCRzaWduYXR1cmUpOwokand0ID0gJHVuc2lnbmVkSldUIC4gJy4nIC4gJGp3dFNpZ25hdHVyZUVuY29kZWQ7CgovLyAyLiBTZW5kIHRvIEdvb2dsZSBPQXV0aAokdG9rZW5SZXF1ZXN0ID0gWwogICAgJ2dyYW50X3R5cGUnID0+ICd1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpqd3QtYmVhcmVyJywKICAgICdhc3NlcnRpb24nID0+ICRqd3QKXTsKCiRjaCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkc2VydmljZUFjY291bnRbJ3Rva2VuX3VyaSddKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIHRydWUpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeSgkdG9rZW5SZXF1ZXN0KSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBbCiAgICAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCl0pOwoKJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CmN1cmxfY2xvc2UoJGNoKTsKCi8vIDMuIFByaW50IHJlc3BvbnNlCmhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyk7CmVjaG8gJHJlc3BvbnNlOwo=