feat: 所有页面添加ICP备案号 浙ICP备2026052792号
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
This commit is contained in:
100
scripts/generate-admin-token.sh
Executable file
100
scripts/generate-admin-token.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
# =============================================================
|
||||
# 管理员 JWT 生成工具
|
||||
# 用法: ./scripts/generate-admin-token.sh <user_id> [environment]
|
||||
#
|
||||
# 说明:
|
||||
# 生成指定 user_id 的管理员 JWT token,用于调用管理 API。
|
||||
# 需要服务器上已安装 python3 和 PyJWT 库。
|
||||
# 在生产服务器上运行,而非本地。
|
||||
#
|
||||
# 示例:
|
||||
# ./scripts/generate-admin-token.sh 1 production # 生产管理员 token
|
||||
# ./scripts/generate-admin-token.sh 1 development # 开发管理员 token
|
||||
# =============================================================
|
||||
set -euo pipefail
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "用法: $0 <user_id> [environment]"
|
||||
echo " 默认 environment=production"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
USER_ID="$1"
|
||||
APP_ENV="${2:-production}"
|
||||
JWT_SECRET=""
|
||||
|
||||
# 优先从 systemd 服务获取(新版部署)
|
||||
if [ "$APP_ENV" = "production" ]; then
|
||||
JWT_SECRET=$(systemctl cat rust-backend-blue.service 2>/dev/null | grep -oP '(?<=^Environment=JWT_SECRET=).*' | head -1)
|
||||
if [ -z "$JWT_SECRET" ]; then
|
||||
JWT_SECRET=$(systemctl cat rust-backend-green.service 2>/dev/null | grep -oP '(?<=^Environment=JWT_SECRET=).*' | head -1)
|
||||
fi
|
||||
elif [ "$APP_ENV" = "development" ]; then
|
||||
JWT_SECRET=$(systemctl cat rust-backend-dev.service 2>/dev/null | grep -oP '(?<=^Environment=JWT_SECRET=).*' | head -1)
|
||||
fi
|
||||
|
||||
# 回退: 从 .env 文件获取(旧版部署)
|
||||
if [ -z "$JWT_SECRET" ] && [ "$APP_ENV" = "production" ]; then
|
||||
for f in /root/rust/rust_backend_blue/.env /root/rust/rust_backend_green/.env; do
|
||||
[ -f "$f" ] && JWT_SECRET=$(grep -oP '(?<=^JWT_SECRET=).*' "$f" 2>/dev/null || true)
|
||||
[ -n "$JWT_SECRET" ] && break
|
||||
done
|
||||
fi
|
||||
if [ -z "$JWT_SECRET" ] && [ "$APP_ENV" = "development" ]; then
|
||||
[ -f /root/rust/rust_backend_dev/.env ] && JWT_SECRET=$(grep -oP '(?<=^JWT_SECRET=).*' /root/rust/rust_backend_dev/.env 2>/dev/null || true)
|
||||
fi
|
||||
|
||||
if [ -z "$JWT_SECRET" ]; then
|
||||
echo "错误: 无法获取 JWT_SECRET,请在服务器上运行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 验证用户 ID 是否为管理员
|
||||
echo "验证用户 ${USER_ID} 的管理员权限..."
|
||||
if command -v docker &>/dev/null; then
|
||||
DB_CONTAINER=$(docker ps --format "{{.Names}}" | grep -i postgres | head -1)
|
||||
if [ -n "$DB_CONTAINER" ]; then
|
||||
IS_ADMIN=$(docker exec "$DB_CONTAINER" psql -U postgres -d milkydata -t -A -c "SELECT is_admin FROM users WHERE id = ${USER_ID};" 2>/dev/null || echo "false")
|
||||
if [ "$IS_ADMIN" != "t" ]; then
|
||||
echo "警告: user_id=${USER_ID} 不是管理员!继续生成但不保证有权限。"
|
||||
else
|
||||
echo "✓ 用户 ${USER_ID} 确认为管理员"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "警告: 未检测到 docker,跳过管理员验证"
|
||||
fi
|
||||
|
||||
# 生成 Token(使用 Python + PyJWT)
|
||||
TOKEN=$(python3 -c "
|
||||
import jwt, time
|
||||
secret = '''${JWT_SECRET}'''
|
||||
claims = {
|
||||
'exp': int(time.time()) + 3600,
|
||||
'iat': int(time.time()),
|
||||
'user_id': ${USER_ID},
|
||||
'openid': 'admin_${USER_ID}',
|
||||
'user_type': 2
|
||||
}
|
||||
token = jwt.encode(claims, secret, algorithm='HS256')
|
||||
print(token)
|
||||
" 2>&1) || {
|
||||
echo "错误: 生成 token 失败,请安装 PyJWT: pip3 install pyjwt"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " 管理员 JWT Token (user_id=${USER_ID}, ${APP_ENV})"
|
||||
echo " 有效期: 1 小时"
|
||||
echo "============================================"
|
||||
echo "$TOKEN"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
echo "使用方式:"
|
||||
echo " curl -H 'Authorization: Bearer 你的TOKEN' \\"
|
||||
echo " https://${APP_ENV}.xmclassmate.top/api/admin/notifications \\"
|
||||
echo " -X POST -H 'Content-Type: application/json' \\"
|
||||
echo " -d '{\"scope\":\"all\",\"type_\":\"maintenance\",\"title\":\"通知标题\",\"content\":\"通知内容\",\"priority\":\"high\"}'"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user