66 lines
2.9 KiB
JavaScript
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 |