В настоящее время я кодирую сервис на perl-сервере, который должен отправить запрос в API Firebase Cloud Messaging, который затем отправит push-уведомления экземпляру приложения.
Поскольку FCM является частью семейства API Google, токен OAuth2 необходим для доступа к API. Во время моего исследования я нашел это решение Perl. Поскольку моя служба работает в среде сервера, отличной от Google, я не могу использовать учетные данные приложения Google по умолчанию, но должен предоставить их вручную, поэтому я скачал json, содержащий закрытый ключ, следуя этому описанию.
Чтение документации по LWP :: Authen :: OAuth2 Я немного запутался, где поместить какой параметр из json в объект $oauth2
, потому что часто разные имена используются для ссылки на такие же значения, как я подозреваю.
JSON, связанный с моим проектом Firebase:
{
"type": "service_account",
"project_id": "my_project_id",
"private_key_id": "some_key_id",
"private_key": "-----BEGIN PRIVATE KEY-----very_long_key-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-o8sf4@<my_project_id>.iam.gserviceaccount.com",
"client_id": "some_client_id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o8sf4%40<my_project_id>.iam.gserviceaccount.com"
}
Реализация объекта $oauth
выглядит следующим образом:
my $oauth2 = LWP::Authen::OAuth2->new(
client_id => "Public from service provider",
#probably that will be "some_client_id" from above
client_secret => "s3cr3t fr0m svc prov",
#the "very_long_key"?
service_provider => "Google",
#the "auth_uri"? That's what I would suggest here
#I've read some about the LWP::Authen::OAuth2::ServiceProvider module
#do I have to create an instance of that here?
#if so, which params do I need for that from the json?
redirect_uri => "https://your.url.com/",
#the FCM api I want to call?
# Optional hook, but recommended.
save_tokens => \&save_tokens,
save_tokens_args => [ $dbh ],
# This is for when you have tokens from last time.
token_string => $token_string.
#yes, i copy-pasted that from the docs
);
Теперь, будучи новичком в Perl и не любящим неоднозначных имен ключей, я немного запутался, какое значение ставить где, и был бы рад, если бы кто-нибудь мог помочь мне с руководством здесь, что поставить куда даже если это кажется очень новым вопросом, это важно для меня: D. Так что я благодарен за каждый полезный ответ!
EDIT
При попытке сгенерировать JSON Web Token вручную в моем сервисе perl с использованием Crypt :: JWT , я наткнулся на другой провод отключения, что заставило меня усомниться в том, что соответствующий API аутентификации из Google "https://www.googleapis.com/auth/firebase.messaging"
по-прежнему принимает токены на предъявителя ... Я попытался сгенерировать свой JWT, который казался успешным, но запрос, который я отправил фактическому API FCM, дал мне следующее:
Request had invalid authentication credentials.
Expected OAuth 2 access token, login cookie
or other valid authentication credential
В ответе, напечатанном как String, я обнаружил этого маленького парня, который сильно смутил меня:
Client-Warning: Unsupported authentication scheme 'bearer'
Теперь я очень не уверен, что токены на предъявителя все еще поддерживаются для API FCM, даже если они используются в примере на странице docs . Есть ли у кого-нибудь актуальная информация об этом? Большое спасибо!