Related repo is here.
Install Node.js environment
Install nodejs and npm, then run these commands.
npm i @cloudflare/binary-install -g
npm i @cloudflare/wrangler -g
npm i @beetcb/ms-graph-cli -g
You may need to set proxy if Internet is limited.
npm config set proxy=http://$IP:$PORT
npm config set https-proxy=http://$IP:$PORT
Get OneDrive API tokens
Open Azure panel and create a new application. Redirect URL should be http://localhost.
Suppose your application ID is $ID.
Then create a client secret, and suppose its value is $VALUE.
Give Microsoft Graph the three permissions below.
offline_access
Files.Read
Files.Read.All
At last, run this command and follow its instruction.
npx @beetcb/ms-graph-cli
Suppose your refresh token is $TOKEN.
Remember to create a folder named Public in your OneDrive root directory, which is the folder you share with.
Create a Cloudflare worker
First, clone the repo.
git clone https://github.com/spencerwooo/onedrive-cf-index
Then login Cloudflare to give permissions.
wrangler login
You can use this command to make sure you have signed in.
wrangler whoami
Create a worker called $NAME in Cloudflare Workers, then edit wrangler.toml and change name to $NAME, account_id and zone_id properly.
Create a KV namespace.
wrangler kv:namespace create "BUCKET" --preview
Then change id and preview_id in wrangler.toml.
Edit src/config/default.js and change client_id to $ID. Also delete the line refresh_token: REFRESH_TOKEN,.
Open your KV namespace and add a new entry with key refresh_token and value $TOKEN.
Edit /src/auth/onedrive.js and add this line after getAccessToken function.
const refresh_token = await BUCKET.get("refresh_token");
Then change config.refresh_token to refresh_token in that file.
At last, set your password as AUTH_PASSWORD and $VALUE as CLIENT_SECRET.
wrangler secret put AUTH_PASSWORD
wrangler secret put CLIENT_SECRET
Customize pages
Edit src/folderView.js and src/render/htmlWrapper.js.
You can also add custom domains. Simply create a CNAME record, and add a Worker Route with route $DOMAIN/*.
Deploy
You may want to preview it first.
wrangler preview
If everything is OK, publish it.
wrangler publish