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.jsonand not from file but from an accessibleStringvalue such as an env var i could set in Atlas Trigger ? - OR : How to store a file to be read from the
contextin Atlas Trigger ?
Thanks a lot in advance !
>Solution :
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
})
});