当前位置: 首页 > news >正文

对免认证服务提供apikey验证

一些服务不带认证,凡是可以访问到服务端口,都可以正常使用该服务,方便是方便,但是不够安全。
比如ollama默认安装后就是这样。现在据说网上扫一下端口11434,免apikey的ollama服务一大堆。。。
那我们怎样将本机安装的ollama能提供给其他用户使用,并且可以加apikey的限制呢?其实方案有很多,我说一个轻量级的解决方案,nginx代理转发,并且进行header中的Authorization信息的检查。
固定值的可以直接写在nginx.conf配置文件里,最简单;如果是使用json文件来存放apikey信息的话,nginx需要使用lua模块来读取json文件,进行解码,windows版的nginx默认不带lua模块,可以用openresty,它相当于集成了lua模块的nginx。json内容可以由其他应用来维护,不过内容有变化需要考虑,如果要求实时更新,那么最好在应用修改json文件内容时也同时通知nginx来更新;或者干脆由另外一个web服务来负责header中apikey的检查,nginx里要写lua代码去执行调用,根据返回结果来决定是否放行;还有一个就是我最终选择的方案-redis,apikey维护服务在apikey生效或者失效时更新redis的集合,nginx从redis里检查集合里是否包含请求头中的apikey。nginx.conf里的lua部分相关代码如下:

...
http {# 引入 Lua 模块lua_package_path "lualib/?.lua;;";lua_package_cpath "lualib/?.so;;";# 定义 Redis 连接参数upstream redis_backend {server 127.0.0.1:6379;  # Redis 服务器地址keepalive 10;           # 保持连接}...server {listen  443 ssl;...location /ollama/ {#if ($request_method = 'OPTIONS') {#	return 204;#	}access_by_lua_block {-- 获取请求头中的 Authorizationlocal auth_header = ngx.var.http_Authorizationif not auth_header thenngx.status = ngx.HTTP_UNAUTHORIZEDngx.say("Unauthorized: Missing Authorization header")return ngx.exit(ngx.HTTP_UNAUTHORIZED)end-- 连接 Redislocal redis = require "resty.redis"local red = redis:new()red:set_timeout(1000)  -- 设置超时时间为 1 秒local ok, err = red:connect("127.0.0.1", 6379)if not ok thenngx.status = ngx.HTTP_INTERNAL_SERVER_ERRORngx.say("Internal Server Error: Failed to connect to Redis")return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- 查询 Redis 中是否存在该密钥local is_member, err = red:sismember("auth_keys", auth_header)if not is_member thenngx.status = ngx.HTTP_INTERNAL_SERVER_ERRORngx.say("Internal Server Error: Failed to query Redis")return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- 关闭 Redis 连接local ok, err = red:set_keepalive(10000, 100)if not ok thenngx.log(ngx.ERR, "Failed to set keepalive: ", err)end-- 检查密钥是否有效if is_member == 0 thenngx.status = ngx.HTTP_UNAUTHORIZEDngx.say("Unauthorized: Invalid Authorization key")return ngx.exit(ngx.HTTP_UNAUTHORIZED)end}# 如果验证通过,代理到目标服务器#add_header 'Access-Control-Allow-Origin' '*';#add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';#add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';#add_header 'Access-Control-Max-Age' 1728000;#proxy_set_header origin http://127.0.0.1:11434;#proxy_set_header X-Real-IP $remote_addr;#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#proxy_set_header X-Forwarded-Proto $scheme;#proxy_set_header Authorization $http_authorization;#proxy_set_header Host localhost:11434;proxy_pass http://127.0.0.1:11434;}...}
}
...

主要是可以参考下lua里将header里认证信息与redis集合进行匹配,其他nginx转发设置头信息跟后端服务要求而定。

http://www.lryc.cn/news/540883.html

相关文章:

  • 数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
  • OceanBase 初探学习历程之——安装部署
  • Windows 下免费开源的多格式文件差异对比工具
  • Vue3+element UI:使用el-dialog时,对话框不出现解决方案
  • postman调用ollama的api
  • PyTorch的dataloader制作自定义数据集
  • 如何调用 DeepSeek API:详细教程与示例
  • Hadoop-HA集群部署
  • 三、linux字符驱动详解
  • 【Research Proposal】基于提示词方法的智能体工具调用研究——研究问题
  • 【从0做项目】Java文档搜索引擎(9)烧脑终章!
  • python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04
  • 如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单
  • echarts 折线图动态基准线设置超出基准线标红
  • Part 3 第十二章 单元测试 Unit Testing
  • C++与Python:两种编程语言的区别
  • Springboot 高频面试题
  • 常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper
  • MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用
  • 如何有效利用MYSQL的连接数
  • 调用click.getchar()时Windows PyCharm无法模拟键盘输入
  • 使用Hardhat实现ERC20 代币合约详解
  • 清华大学《DeepSeek与AI幻觉》(无套路免费分享)
  • 代码随想录算法【Day52】
  • Spark 和 Flink
  • Unity结合Vuforia虚拟按键实现AR机械仿真动画效果
  • PL/SQL 异常处理
  • 【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
  • Redis 缓存穿透、击穿、雪崩:问题与解决方案
  • 第一个CMAKE项目hello cmake