I am trying to send a firebase admin push notification from my Atlas trigger.
The firebase admin sdk requires initialization by file (i could not find any documentation on how to do differently) so here is the code i have got so far :
const admin = require("firebase-admin");
const json_creds = context.values.get("admin_key");
admin.initializeApp({
credential: admin.credential.cert(json_creds)
});
This throws the following error :
{"message":"Failed to parse service account json file: FunctionError: file not found: { \"type\": \"service_account\", \"project_id\":........}
So i understand from this that admin.credential.cert()
takes a file
as input and not a String
, however in Atlas trigger i have store the value as a secret and linked it to a value to be retrieved from context.values
.
To solve my problems i have two different questions :
- How to initialize the firebase admin SDK from the content of the
service_account.json
and not from file but from an accessibleString
value such as an env var i could set in Atlas Trigger ? - OR : How to store a file to be read from the
context
in Atlas Trigger ?
Thanks a lot in advance !
CodePudding user response:
If you are passing a string
to cert()
, then that should be path to a file and as the error suggest the provided path does not exists (it seems a stringified JSON). Instead you can parse the string and pass an object as shown below:
admin.initializeApp({
credential: admin.credential.cert(JSON.parse(json_creds))
});
In case of Typescript, you can assert that provided object is a ServiceAccount
like this:
admin.credential.cert(JSON.parse(json_creds) as ServiceAccount)
Alternatively, you can store each key of a service account separately like:
const fb_project_id = context.values.get("project_id");
const fb_private_key = context.values.get("private_key");
admin.initializeApp({
credential: admin.credential.cert({
project_id: fb_project_id,
private_key: fb_private_key
})
});