Files
ebay_api/api/utils/fetchEbayUserToken.js

66 lines
2.9 KiB
JavaScript

import fetch from "node-fetch";
const fetchEbayUserToken = async (req, res) => {
const ebayClientId = process.env.EBAY_CLIENT_ID;
const ebayClientSecret = process.env.EBAY_CLIENT_SECRET;
const refreshToken = process.env.EBAY_REFRESH_TOKEN; // This is retrieved from a manual process
const credentials = Buffer.from(`${ebayClientId}:${ebayClientSecret}`).toString("base64");
const scopes = encodeURIComponent([
"https://api.ebay.com/oauth/api_scope",
"https://api.ebay.com/oauth/api_scope/sell.marketing.readonly",
"https://api.ebay.com/oauth/api_scope/sell.marketing",
"https://api.ebay.com/oauth/api_scope/sell.inventory.readonly",
"https://api.ebay.com/oauth/api_scope/sell.inventory",
"https://api.ebay.com/oauth/api_scope/sell.account.readonly",
"https://api.ebay.com/oauth/api_scope/sell.account",
"https://api.ebay.com/oauth/api_scope/sell.fulfillment.readonly",
"https://api.ebay.com/oauth/api_scope/sell.fulfillment",
"https://api.ebay.com/oauth/api_scope/sell.analytics.readonly",
"https://api.ebay.com/oauth/api_scope/sell.finances",
"https://api.ebay.com/oauth/api_scope/sell.payment.dispute",
"https://api.ebay.com/oauth/api_scope/commerce.identity.readonly",
"https://api.ebay.com/oauth/api_scope/sell.reputation",
"https://api.ebay.com/oauth/api_scope/sell.reputation.readonly",
"https://api.ebay.com/oauth/api_scope/commerce.notification.subscription",
"https://api.ebay.com/oauth/api_scope/commerce.notification.subscription.readonly",
"https://api.ebay.com/oauth/api_scope/sell.stores",
"https://api.ebay.com/oauth/api_scope/sell.stores.readonly"
].join(' '));
const token = req.cookies.ebayUserToken;
const tokenExpiry = req.cookies.ebayUserTokenExpiry ? new Date(req.cookies.ebayUserTokenExpiry) : null;
// Check if the token exists and is not expired
if (token && tokenExpiry && new Date() < tokenExpiry) {
return token; // Token is valid, use it
}
try {
const response = await fetch("https://api.ebay.com/identity/v1/oauth2/token", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": `Basic ${credentials}`,
},
body: `grant_type=refresh_token&refresh_token=${refreshToken}&scope=${scopes}`,
});
if (!response.ok) {
const errorBody = await response.text();
throw new Error(`Failed to fetch eBay user token: ${response.status} ${response.statusText} - ${errorBody}`);
}
const data = await response.json();
const expiryDuration = 1.92 * 60 * 60 * 1000; // 1 hour 55 minutes in milliseconds
// Store the new token in an HTTP-only cookie
res.cookie('ebayUserToken', data.access_token, { httpOnly: true, maxAge: expiryDuration });
return data.access_token;
} catch (error) {
console.error("Error fetching eBay user token:", error);
throw error;
}
};
export default fetchEbayUserToken