106 lines
3.1 KiB
JavaScript
106 lines
3.1 KiB
JavaScript
import axios from "axios";
|
||
import qs from "qs";
|
||
import fs from "fs";
|
||
import dotenv from "dotenv";
|
||
|
||
// -----------------------------
|
||
// CONFIG
|
||
// -----------------------------
|
||
dotenv.config();
|
||
// Load non‑sensitive values from config.json
|
||
const CONFIG = JSON.parse(fs.readFileSync("config.json", "utf8"));
|
||
const tenantId = CONFIG.tenantId;
|
||
const clientId = CONFIG.clientId;
|
||
const testSharePointFileUrl = CONFIG.testSharePointFileUrl;
|
||
|
||
// Load secret only from .env
|
||
const clientSecret = process.env.CLIENT_SECRET;
|
||
|
||
// -----------------------------
|
||
// Validation
|
||
// -----------------------------
|
||
const missing = [];
|
||
if (!tenantId) missing.push("tenantId");
|
||
if (!clientId) missing.push("clientId");
|
||
if (!clientSecret) missing.push("clientSecret");
|
||
if (!testSharePointFileUrl) missing.push("testSharePointFileUrl");
|
||
|
||
if (missing.length > 0) {
|
||
console.error("❌ Missing values:", missing.join(", "));
|
||
process.exit(1);
|
||
} else {
|
||
console.log("✅ All required values present");
|
||
}
|
||
|
||
// -----------------------------
|
||
// 1. Get Graph Token (Client Credentials)
|
||
// -----------------------------
|
||
async function getGraphToken() {
|
||
const tokenUrl = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;
|
||
|
||
const body = qs.stringify({
|
||
client_id: clientId,
|
||
client_secret: clientSecret,
|
||
scope: "https://graph.microsoft.com/.default",
|
||
grant_type: "client_credentials",
|
||
});
|
||
|
||
try {
|
||
const res = await axios.post(tokenUrl, body, {
|
||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||
});
|
||
|
||
console.log("✅ Token acquired");
|
||
// can use to test to see the full token as needed, just remove this comment// console.log("🔑 Access Token:", res.data.access_token);
|
||
return res.data.access_token;
|
||
|
||
} catch (err) {
|
||
console.error("❌ Failed to acquire token");
|
||
console.error(err.response?.data || err.message);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// -----------------------------
|
||
// 2. Convert SharePoint File URL → Drive Item ID
|
||
// -----------------------------
|
||
function normalizeSharePointUrl(fileUrl) {
|
||
return fileUrl
|
||
.replace("guestaccess.aspx", "")
|
||
.replace(/\?.*$/, ""); // remove ?query
|
||
}
|
||
|
||
// -----------------------------
|
||
// 3. Test GET file metadata
|
||
// -----------------------------
|
||
async function testFileAccess(token) {
|
||
const cleanUrl = normalizeSharePointUrl(testSharePointFileUrl);
|
||
|
||
console.log("🔎 Normalized URL:", cleanUrl);
|
||
|
||
const graphUrl =
|
||
`https://graph.microsoft.com/v1.0/shares/u!${Buffer.from(cleanUrl).toString("base64")}/driveItem`;
|
||
|
||
try {
|
||
const res = await axios.get(graphUrl, {
|
||
headers: { Authorization: `Bearer ${token}` },
|
||
});
|
||
|
||
console.log("✅ SharePoint file access test succeeded!");
|
||
console.log("File name:", res.data.name);
|
||
console.log("Drive Item ID:", res.data.id);
|
||
} catch (err) {
|
||
console.error("❌ SharePoint file access failed");
|
||
console.error(err.response?.data || err.message);
|
||
}
|
||
}
|
||
|
||
// -----------------------------
|
||
// MAIN
|
||
// -----------------------------
|
||
(async () => {
|
||
console.log("🔵 Testing SharePoint Access…");
|
||
const token = await getGraphToken();
|
||
await testFileAccess(token);
|
||
})();
|