
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
该镜像提供一个带JWT(JSON Web Token)认证功能的反向代理服务。它作为前端网关,拦截所有传入请求并进行JWT验证,仅允许携带有效JWT的请求转发至后端服务,有效保护API资源安全。
authorization HTTP头的请求authorization头中不包含JWT的请求客户端需生成RSA密钥对,私钥用于签名JWT,公钥提供给代理用于验证签名:
bashopenssl genrsa -out example_private.pem 2048
bashopenssl rsa -in example_private.pem -outform PEM -pubout -out example_public.pem
Header
JWT必须使用RS256算法签名:
json{ "alg": "RS256", "typ": "JWT" }
Payload
必须包含发行者(iss)和过期时间(exp)字段:
json{ "iss": "custom_issuer.example.com", // 双方约定的发行者 "exp": "1504282460" // Unix时间戳格式的过期时间 }
配置可通过环境变量或命令行参数(格式:-参数名)提供:
| 环境变量 | 命令行参数 | 说明 |
|---|---|---|
| JWTPROXY_REMOTE_URL | -remoteURL | 后端服务URL,代理请求将转发至此 |
| JWTPROXY_REMOTE_HOST_HEADER | -remoteHostHeader | 发送给后端的Host头(当后端不使用DNS时有用) |
| JWTPROXY_LISTEN_PORT | -port | 代理服务监听端口 |
| JWTPROXY_HEALTHCHECK_URI | -health | 健康检查URI,默认值:/health |
| JWTPROXY_PREFIX | -prefix | 从请求中剥离的路径前缀,如将/api/user映射为/user |
| JWTPROXY_CONFIG | -keys | 包含发行者-公钥映射的JSON文件路径 |
发行者-公钥映射配置
有两种方式配置发行者与公钥的映射关系:
1. 环境变量方式
使用带相同后缀的JWTPROXY_ISSUER_和JWTPROXY_PUBLIC_KEY_环境变量对:
JWTPROXY_ISSUER_0=example.com JWTPROXY_PUBLIC_KEY_0=-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxFj26fqmulXntc7kCp9tMs6MEQUsk2r16Jd6k+aZSaLBo0dVgP77q1os10gZT4N0gYH6NsbVqP4+wWAUIDiemhpxq986z5mtB/lGvmHmaQcK/bOnEvcLWinHJZIla1m2RF7diN5/WBRNh8CyYMiW+BV/6dngknBtP7bDpnCkYrySaOQtKRvrech1UFRKgQjD8bprrcUmOFWYrmKe2NCxcQs9RhYuACt3Du2Z4VwVWN2xvL5LlZdWK7jLENe3MkOZU5WcwA7n+K/tulqA9uNRv8cRIL/y8BUwUsUoqBiyVZXQUa7BgE82GoTXtv3uqkN/yZxnlEcaJW5BD1nFzuvuyQIDAQAB-----END PUBLIC KEY-----
2. JSON文件方式
创建包含发行者-公钥映射的JSON文件(注意:公钥中的换行符需替换为\n):
bashcat dev_pub.pem | tr '\n' '_' | sed 's/_/\\n/g' > dev_pub2.pem
json{ "example.com": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxFj26fqmulXntc7kCp9t\nMs6MEQUsk2r16Jd6k+aZSaLBo0dVgP77q1os10gZT4N0gYH6NsbVqP4+wWAUIDie\nmhpxq986z5mtB/lGvmHmaQcK/bOnEvcLWinHJZIla1m2RF7diN5/WBRNh8CyYMiW\n+BV/6dngknBtP7bDpnCkYrySaOQtKRvrech1UFRKgQjD8bprrcUmOFWYrmKe2NCx\ncQs9RhYuACt3Du2Z4VwVWN2xvL5LlZdWK7jLENe3MkOZU5WcwA7n+K/tulqA9uNR\nv8cRIL/y8BUwUsUoqBiyVZXQUa7BgE82GoTXtv3uqkN/yZxnlEcaJW5BD1nFzuvu\nyQIDAQAB\n-----END PUBLIC KEY-----" }
Docker命令行运行
bashdocker run --link hopeful_pike -p 9090:9090/tcp --rm \ -e "JWTPROXY_LISTEN_PORT=9090" \ -e "JWTPROXY_REMOTE_URL=http://hopeful_pike:8080" \ -v /users/me/keys.json:/keys.json \ -e "JWTPROXY_CONFIG=keys.json" \ adrianhesketh/jwtproxy
访问代理服务
使用curl发送带有效JWT的请求:
bashcurl -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOiIxNDg2MzkyMjAwIiwiZXhwIjoiMTU4NjM5MjIwMCIsImlzcyI6ImV4YW1wbGUuY29tIn0.McHwUVbe96y-vaTOExPjANm8e8p0v6I7puPf74SV7Jn-QYprrhLlklnBP4MEF77v0LIBUFKgzpOMfldCONId3ktOFOf0117x9iWG3J-Zf6Ni3HinhA9U1pPU7_OhTtkXacmgats8tLWAqmOz46NeyAmHS_dkvodUUPpcHY-AqQtzM4ql6RZpMDstz5dFJWZh9P0_prPknoI-argt2jn-KGajCOIghcGxNarylq5oX62rT9AavavyWGnJW0zLnP9qtIuChzigU542Nbg7y6_E7FaVA2cPICPuiPehn6vVTKuVil0o2SJgFD2J2HQfxa0iDrc8HzbubMGJcw7Vlpkk0w" \ http://localhost:9090
可通过jwt.io或JWT库生成测试JWT,Payload应包含:
iat:JWT生成时间(Unix时间戳)exp:过期时间(Unix时间戳)iss:发行者(需与配置中的发行者匹配)示例Payload:
json{ "iat": "1486392200", "exp": "1586392200", "iss": "example.com" }
bash# 生成数据哈希 openssl dgst -sha256 -binary data.json > hash.bin openssl base64 -e -in hash.bin -out hash.b64 # 签名哈希 openssl rsautl -in hash.bin -inkey private_test.pem -sign -out signature.bin openssl base64 -e -in signature.bin -out signature.b64 # 验证签名 openssl rsautl -in signature.bin -verify -inkey public_test.pem -pubin > verified.bin openssl base64 -e -in verified.bin -out verified.b64 # 比较原始哈希和验证后的哈希(应相同) cat hash.b64 cat verified.b64
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务