使用nginx+lua进行token鉴权的方法

 更新时间:2024年10月10日 10:30:27   作者:逸丶时光  
使用nginx和lua脚本实现对Minio服务器图片链接的token鉴权,通过反向代理隐藏真实IP,增强安全性,介绍了整个鉴权流程,包括nginx配置和lua脚本的具体实现,适用于需要保护图片不被未授权访问的场景

最近在使用minio文件服务器,来实现图片上传与展示功能,在展示的时候出现一个问题,就是图片在做鉴权时,minio提供的有效地址是真的拉跨,没法实现图片链接的有效鉴权功能,而且链接直接给出来的话也有风险。

后面想着加一个反向代理的方式,也就是Nginx做代理,这样就不会暴露图片的ip地址。但是,在做鉴权时遇到了麻烦,网络上大部分推荐lua脚本来实现鉴权的方式,在经过几天的不断试错,才最终将他实现,现在在此记录下。

工具:openresty(nginx集成lua模块,比较简单)

lua包需要下载lua-resty-http工具包,地址lua-resty-http,解压后将.lua文件放到 lualib\resty目录下就行。

实现思路:用户发送请求---> nginx ----->根据图片路径策略-----> 执行lua代码(发送http到后端token鉴权)----->通过就代理到具体图片服务器----->否则提示无权限

nginx关键代码

http {
    
    # 定义全局变量
    init_by_lua_block {
		cjson = require "cjson";
		http = require "resty.http";
	}

    server {
        
        location ~^/(api)/image/(.*)$ {
			rewrite_by_lua_block {
				-- local cjson = require "cjson"
				-- local http = require "resty.http"
				local httpc = http.new()
				local ngx = ngx
				local headers = ngx.req.get_headers()
				-- get请求参数中T就是token
				local token = headers["token"]
				local request_method = ngx.var.request_method
				local args = nil
				if "GET" == request_method then
					args = ngx.req.get_uri_args()
				elseif "POST" == request_method then
					ngx.req.read_body()
					args = ngx.req.get_post_args()
				end
				
				token = args["token"];
				if not token then
					ngx.header['Content-Type'] = 'text/plain; charset=utf-8';
					ngx.status = ngx.HTTP_FORBIDDEN
					ngx.say("您无权限浏览该图片。")
					ngx.exit(200)
				end
				-- 字符串拼接
                -- 你要实现token鉴权的服务,header和参数都给你实现了,根据实际需要选择
				local url = "http://127.0.0.1:8080/image/checkToken?token="..token;
				
				local res, err = httpc:request_uri(url, {method="GET", headers={["token"]=token}})
				
				if not res then 
					ngx.header['Content-Type'] = 'text/plain; charset=utf-8';
					ngx.say(cjson.encode({message = "Error getting response",status = ngx.HTTP_INTERNAL_SERVER_ERROR }));					
					ngx.exit(200)
				end
                if res.body == '0' then 
					ngx.header['Content-Type'] = 'text/plain; charset=utf-8';
					ngx.say("您无权限浏览该图片。");					
					ngx.exit(200)
				end	
			}
			
			proxy_pass http://yourip:9000/$2;
			
		}
    }
}

Java后端代码

@RestController
@RequestMapping("/image")
public class TokenResource {
    @RequestMapping("/checkToken")
    public String checkToken(HttpServletRequest request, String token) {
        System.out.println("程序进来了");
        String header = request.getHeader("token");
        System.out.println("头部token:" + header);
        if (StringUtils.isEmpty(token)) {
            System.out.println(token + ":0");
            return "0";
        }
        if ("1".equals(token)) {
            System.out.println(token + ":1");
            return "1";
        }
        return "0";
    }
}

当token校验通过,就不做拦截,lua代码执行完会走到nginx的转发路径上来

​proxy_pass http://your_ip:9000/$2​

~^/(api)/image/(.*)$ 写成 ~^/api/image/(.*)$ 时 proxy_pass 改为 http://your_ip:9000/$1

 到此这篇关于使用nginx+lua进行token鉴权的方法的文章就介绍到这了,更多相关nginx lua token鉴权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx实现异步访问mysql的配置方法

    Nginx实现异步访问mysql的配置方法

    这篇文章主要介绍了Nginx实现异步访问mysql的配置方法,本文先是讲解了安装配置方法,然后给出了使用方法,需要的朋友可以参考下
    2015-06-06
  • nginx+php的新基础镜像制作全过程

    nginx+php的新基础镜像制作全过程

    这篇文章主要介绍了基于alpine基础镜像,构建含nginx、php服务的新基础镜像的过程,文中通过代码示例和图文结合的方式介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • Nginx中if语句的判断条件与多条件判断详解

    Nginx中if语句的判断条件与多条件判断详解

    这篇文章主要介绍了关于Nginx中if语句的判断条件与多条件判断的相关资料,文中给出了详细的示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    Nginx+iptables屏蔽访问Web页面过于频繁的IP(防DDOS,恶意访问,采集器)

    通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx.
    2010-11-11
  • 详解metricbeat监控nginx情况

    详解metricbeat监控nginx情况

    这篇文章主要介绍了详解metricbeat监控nginx情况,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Windows下用Nginx配置https服务器及反向代理的问题

    Windows下用Nginx配置https服务器及反向代理的问题

    这篇文章主要介绍了Windows下用Nginx配置https服务器及反向代理的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 深入探究Nginx体系化之虚拟主机分类及配置实现

    深入探究Nginx体系化之虚拟主机分类及配置实现

    Nginx,这款备受推崇的高性能 Web 服务器,以其强大的性能和灵活的配置而广受欢迎,在实际应用中,虚拟主机是一项重要的功能,允许我们在单个服务器上托管多个网站,本文将深入探讨 Nginx 虚拟主机的分类和配置实现,帮助您构建一个高效多站点托管平台
    2023-08-08
  • nginx location指令(匹配顺序匹配冲突)实战示例详解

    nginx location指令(匹配顺序匹配冲突)实战示例详解

    这篇文章主要介绍了nginx location指令(实战示例匹配顺序匹配冲突)详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Nginx 启动、停止、重启、升级操作命令收集

    Nginx 启动、停止、重启、升级操作命令收集

    也许你不知道什么是Nginx,Nginx是一个WEB服务器,如IIS那样,现在好多门户都在使用了Nginx作为WEB服务器了,Nginx在Linux系统下跑很优秀,强过其它的WEB服务端,还可以做负载均衡,很不错吧。
    2010-10-10
  • 详细nginx多域名配置的方法

    详细nginx多域名配置的方法

    Nginx绑定多个域名,可通过把多个域名规则写一个配置文件里实现,也可通过分别建立多个域名配置文件实现,为了管理方便,建议每个域名建一个文件,有些同类域名则可写在一个总的配置文件里。下面这篇文章就来详细看看nginx多域名配置的方法,有需要的朋友们可以参考。
    2016-12-12

最新评论