mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2025-08-10 07:19:01 +08:00
feat(wip): 支持 JWT
This commit is contained in:
parent
07e50175f9
commit
542957d34a
@ -28,10 +28,10 @@
|
|||||||
"http-proxy-middleware": "^2.0.6",
|
"http-proxy-middleware": "^2.0.6",
|
||||||
"ip-address": "^9.0.5",
|
"ip-address": "^9.0.5",
|
||||||
"js-base64": "^3.7.2",
|
"js-base64": "^3.7.2",
|
||||||
|
"jsonwebtoken": "^9.0.2",
|
||||||
"jsrsasign": "^11.1.0",
|
"jsrsasign": "^11.1.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
"requests": "^0.3.0",
|
|
||||||
"semver": "^7.3.7",
|
"semver": "^7.3.7",
|
||||||
"static-js-yaml": "^1.0.0",
|
"static-js-yaml": "^1.0.0",
|
||||||
"uuid": "^8.3.2"
|
"uuid": "^8.3.2"
|
||||||
|
14758
backend/pnpm-lock.yaml
generated
14758
backend/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -143,7 +143,7 @@ export default function serve() {
|
|||||||
try {
|
try {
|
||||||
fs.accessSync(path.join(fe_abs_path, 'index.html'));
|
fs.accessSync(path.join(fe_abs_path, 'index.html'));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error(
|
$.error(
|
||||||
`[FRONTEND] index.html file not found in ${fe_abs_path}`,
|
`[FRONTEND] index.html file not found in ${fe_abs_path}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -158,6 +158,7 @@ export default function serve() {
|
|||||||
|
|
||||||
const staticFileMiddleware = express_.static(fe_path);
|
const staticFileMiddleware = express_.static(fe_path);
|
||||||
|
|
||||||
|
let be_share_rewrite = '/share/:type/:name';
|
||||||
let be_api_rewrite = '';
|
let be_api_rewrite = '';
|
||||||
let be_download_rewrite = '';
|
let be_download_rewrite = '';
|
||||||
let be_api = '/api/';
|
let be_api = '/api/';
|
||||||
@ -174,6 +175,45 @@ export default function serve() {
|
|||||||
be_download_rewrite = `${
|
be_download_rewrite = `${
|
||||||
fe_be_path === '/' ? '' : fe_be_path
|
fe_be_path === '/' ? '' : fe_be_path
|
||||||
}${be_download}`;
|
}${be_download}`;
|
||||||
|
|
||||||
|
const jwt = eval(`require("jsonwebtoken")`);
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
be_share_rewrite,
|
||||||
|
createProxyMiddleware({
|
||||||
|
target: `http://127.0.0.1:${port}`,
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: (path, req) => {
|
||||||
|
if (req.method.toLowerCase() !== 'get')
|
||||||
|
throw new Error('Method not allowed');
|
||||||
|
const payload = jwt.verify(
|
||||||
|
req.query.token,
|
||||||
|
fe_be_path,
|
||||||
|
);
|
||||||
|
if (
|
||||||
|
payload.type !== req.params.type ||
|
||||||
|
payload.name !== req.params.name
|
||||||
|
)
|
||||||
|
throw new Error('Forbbiden');
|
||||||
|
if (payload.type === 'sub')
|
||||||
|
return path.replace(
|
||||||
|
'/share/sub/',
|
||||||
|
'/download/',
|
||||||
|
);
|
||||||
|
if (payload.type === 'col')
|
||||||
|
return path.replace(
|
||||||
|
'/share/col/',
|
||||||
|
'/download/collection/',
|
||||||
|
);
|
||||||
|
if (payload.type === 'file')
|
||||||
|
return path.replace(
|
||||||
|
'/share/file/',
|
||||||
|
'/api/file/',
|
||||||
|
);
|
||||||
|
throw new Error('Not Found');
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
);
|
||||||
app.use(
|
app.use(
|
||||||
be_api_rewrite,
|
be_api_rewrite,
|
||||||
createProxyMiddleware({
|
createProxyMiddleware({
|
||||||
@ -220,6 +260,9 @@ export default function serve() {
|
|||||||
$.info(
|
$.info(
|
||||||
`[FRONTEND -> BACKEND] ${fe_address}:${fe_port}${be_download_rewrite} -> http://127.0.0.1:${port}${be_download}`,
|
`[FRONTEND -> BACKEND] ${fe_address}:${fe_port}${be_download_rewrite} -> http://127.0.0.1:${port}${be_download}`,
|
||||||
);
|
);
|
||||||
|
$.info(
|
||||||
|
`[SHARE BACKEND] ${fe_address}:${fe_port}${be_share_rewrite}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,26 @@ export default function register($app) {
|
|||||||
$app.get('/api/utils/env', getEnv); // get runtime environment
|
$app.get('/api/utils/env', getEnv); // get runtime environment
|
||||||
$app.get('/api/utils/backup', gistBackup); // gist backup actions
|
$app.get('/api/utils/backup', gistBackup); // gist backup actions
|
||||||
$app.get('/api/utils/refresh', refresh);
|
$app.get('/api/utils/refresh', refresh);
|
||||||
|
$app.post('/api/jwt', (req, res) => {
|
||||||
|
if (!ENV().isNode) {
|
||||||
|
return failed(
|
||||||
|
res,
|
||||||
|
new RequestInvalidError(
|
||||||
|
'INVALID_ENV',
|
||||||
|
`This endpoint is only available in Node.js environment`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const { payload, options } = req.body;
|
||||||
|
const jwt = eval(`require("jsonwebtoken")`);
|
||||||
|
res.set('Content-Type', 'application/json;charset=utf-8').send({
|
||||||
|
token: jwt.sign(
|
||||||
|
payload,
|
||||||
|
eval('process.env.SUB_STORE_FRONTEND_BACKEND_PATH'),
|
||||||
|
options,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// Storage management
|
// Storage management
|
||||||
$app.route('/api/storage')
|
$app.route('/api/storage')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user