const {onCall, HttpsError} = require("firebase-functions/v2/https");
const {defineSecret} = require("firebase-functions/params");
const jwt = require("jsonwebtoken");
// Define Zoom Secrets
const zoomApiKey = defineSecret("ZOOM_SDK_KEY");
const zoomApiSecret = defineSecret("ZOOM_SDK_SECRET");
/**
* Function to generate Zoom JWT Token
*/
exports.generateZoomToken = onCall(
{secrets: [zoomApiKey, zoomApiSecret]},
async (req, context) => {
const {tpc, roleType} = req.data; // No spaces after '{' and before '}'
// Validate inputs
if (!tpc) {
throw new HttpsError("invalid-argument", "Topic is required.");
}
// Define payload for JWT
const payload = {
app_key: zoomApiKey.value(),
tpc: tpc, // Session Name
version: 1,
role_type: roleType || 0,
iat: Math.floor(Date.now() / 1000) - 30,
exp: Math.floor(Date.now() / 1000) + 60 * 60 * 2,
};
// Generate JWT Token
const token = jwt.sign(payload, zoomApiSecret.value());
return {token}; // Added trailing comma as needed
},
);
exports.inviteByPhone = onCall(
{secrets: [zoomApiKey, zoomApiSecret]},
async (req, context) => {
const {sessionId, inviteeName, phoneNumber} = req.data;
// Validate inputs
if (!sessionId || !inviteeName || !phoneNumber) {
throw new HttpsError("invalid-argument", "Need args.");
}
try {
// Generate JWT Token
const payload = {
app_key: zoomApiKey.value(),
tpc: sessionId, // Assuming 'tpc' is used as session name
version: 1,
role_type: 0,
iat: Math.floor(Date.now() / 1000) - 30,
exp: Math.floor(Date.now() / 1000) + 60 * 60 * 2,
};
const token = jwt.sign(payload, zoomApiSecret.value());
console.log("sessionId:::::", sessionId);
console.log("TOKEN:::::", token);
// Prepare the API endpoint
const url = `https://api.zoom.us/v2/videosdk/sessions/${sessionId}/events`;
// Make the API request to invite by phone
const response = await fetch(url, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${token}`,
},
body: JSON.stringify({
method: "user.invite.callout",
params: {
invitee_name: inviteeName,
phone_number: phoneNumber,
},
}),
});
const data = await response.json();
if (!response.ok) {
console.error("Zoom API Error:", data);
throw new HttpsError("internal",
data.message || "Failed to invite by phone.");
}
return {success: true, data};
} catch (error) {
console.error("Error inviting by phone:", error);
throw new HttpsError("internal",
error.message || "An error occurred while inviting by phone.");
}
},
);
I have these 2 functions.
GenerateZoomToken i use to create the token to initiate the call which is working fine.
When I try to call the rest API I get the message Error inviting by phone: HttpsError: Invalid access token.
What Am I missing here?