在帖子【优雅+安全】GPT4私人拼车神器——轻松实现聊天隔离+链接直达+全自动刷新token 基础上,修改worker
代码如下:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
function parseJwt(token) {
const base64Url = token.split('.')[1]; // 获取载荷部分
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); // 将 Base64Url 转为 Base64
const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload); // 返回载荷解析后的 JSON 对象
}
function isTokenExpired(token) {
const payload = parseJwt(token);
const currentTime = Math.floor(Date.now() / 1000); // 获取当前时间戳(秒)
return payload.exp < currentTime; // 检查 token 是否过期
}
async function getOAuthLink(shareToken, proxiedDomain) {
const url = `https://${proxiedDomain}/api/auth/oauth_token`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Origin': `https://${proxiedDomain}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
share_token: shareToken
})
})
const data = await response.json();
return data.login_url;
}
async function getShareToken(userName, at) {
const url = 'https://chat.oaifree.com/token/register';
const body = new URLSearchParams({
// 此处为获取Share Token时的请求参数,可自行配置
access_token: at,
unique_name: userName,
site_limit: '', // 限制的网站
expires_in: '0', // token有效期(单位为秒),填 0 则永久有效
gpt35_limit: '-1', // gpt3.5 对话限制
gpt4_limit: '-1', // gpt4 对话限制
show_conversations: 'false', // 是否显示所有人的会话
show_userinfo: 'false', // 是否显示用户信息
reset_limit: 'false' // 是否重置对话限制
}).toString();
const apiResponse = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: body
});
const responseText = await apiResponse.text();
const tokenKeyMatch = /"token_key":"([^"]+)"/.exec(responseText);
const tokenKey = tokenKeyMatch ? tokenKeyMatch[1] : 'share token 获取失败';
await oai_global_variables.put(userName,tokenKey);
return tokenKey;
}
async function handleRequest(request) {
const url = new URL(request.url);
const params = new URLSearchParams(url.search);
const userName = params.get('un');
// @ts-ignore
// 验证用户名是否存在
const users = await oai_global_variables.get("users");
if (!users.split(",").includes(userName)) {
return new Response('用户不存在', { status: 404 });
}
// @ts-ignore
const accessToken = await oai_global_variables.get('at');
if (isTokenExpired(accessToken)) {
// 给没有refresh token的萌新用(比如我),取消下面这行注释即可享用
return new Response('当前access token未更新,请联系管理员更新', { status: 401 });
// 如果 Token 过期,执行获取新 Token 的逻辑
// const url = 'https://token.oaifree.com/api/auth/refresh';
// // @ts-ignore
// const refreshToken = await oai_global_variables.get('rt'); // 实际情况下你可能会从某处获取这个值
// // 发送 POST 请求
// const response = await fetch(url, {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
// },
// body: `refresh_token=${refreshToken}`
// });
// // 检查响应状态
// if (response.ok) {
// const data = await response.json(); // 假设服务器返回的是 JSON 格式数据
// const token = data.access_token; // 直接从 JSON 中获取 access_token
// // @ts-ignore
// await oai_global_variables.put('at', token);
// } else {
// return new Response('Error fetching access token', { status: response.status });
// }
}
// @ts-ignore
const tokenPrefix = await oai_global_variables.get('token_prefix');
let value = await oai_global_variables.get(tokenPrefix + userName);
if (!value) {
const shareToken = await getShareToken(tokenPrefix + userName, accessToken);
if (shareToken === 'share token 获取失败') {
return new Response('token获取失败,请刷新重试', { status: 500 });
}
// @ts-ignore
const proxiedDomain = await oai_global_variables.get('proxied_domain');
return Response.redirect(await getOAuthLink(shareToken, proxiedDomain), 302);
}else{
const proxiedDomain = await oai_global_variables.get('proxied_domain');
return Response.redirect(await getOAuthLink(value, proxiedDomain), 302);
}
}