searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

基于OpenResty的token验证和动态跳转

2023-10-07 08:15:44
52
0

背景:非对象存储的静态资源图片没有做权限限制,任何人拿到URL都可以访问,我们的静态资源都是由Nginx直接做的映射,所以需要做token验证,在有效期内验证通过才可以访问。

首先明确一个概念,OpenResty 是 Nginx 和 Lua 的结合体,而非 Nginx 的扩展。普通的nginx无法编写lua脚本,但OpenResty可以做到。如果之前机器上安装过了 Nginx,建议是先卸载掉再安装OpenResty

步骤1:创建verify_token.lua脚本:

-- 获取请求头
local headers = ngx.req.get_headers()
-- 获得请求头中的 token 参数
local token = headers["token"]
if token then
    -- 这里连接了本地redis,如果有密码,需要加上 -a 参数
    local cmd = "redis-cli -h 127.0.0.1 -p 6379 -n 0 get "..token
    local f = io.popen(cmd)
    res = tostring(f:read())
    f:close()
    -- 这里判断 redis 中是否存在 token
    if res ~= " " then
        -- 在这里可以加一些复杂逻辑
        return "URL A"
    else
        return "URL B"
    end
else
    return "URL C"
end

步骤2在 nginx.conf 文件中加入配置:

server {
        listen       8005;
        server_name  localhost;

        location / {
            resolver 8.8.8.8;
            set_by_lua_file $full_proxy_pass 绝对路径/verify_token.lua;

            proxy_set_header Host $proxy_host;
            proxy_pass  $full_proxy_pass;
        }
    }

注意这里有两个关键配置,如果不加上,跳转的时候就会报404错误

关键配置1

proxy_set_header Host $proxy_host;

语法

proxy_set_header field value;

默认值

proxy_set_header Host $proxy_host;

proxy_set_header Connection close;

上下文

http, server, location

proxy_set_header 允许重新定义或者添加发往后端服务器的请求头。

value可以包含文本、变量或者它们的组合。

当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

所以上述 nginx.conf 如果不重新定义 proxy_set_header Host 的话,那么默认 Host 值就还是当前访问路径的 Host 信息。

关键配置2

resolver 8.8.8.8;

反向代理的场景下,upstream后端用域名时,配置resolver以便于nginx能够解析该域名。

平时我们在配置NG upstream 时,一般都是指定 IP 地址或者是地址池,或者是一个固定的域名。

但一些复杂的场景,比如我们的 upstream 是变量的 servername,这时候需要用到resolver 的指令用来对变量做解析了。

 

0条评论
0 / 1000
Mr. 油
89文章数
0粉丝数
Mr. 油
89 文章 | 0 粉丝
原创

基于OpenResty的token验证和动态跳转

2023-10-07 08:15:44
52
0

背景:非对象存储的静态资源图片没有做权限限制,任何人拿到URL都可以访问,我们的静态资源都是由Nginx直接做的映射,所以需要做token验证,在有效期内验证通过才可以访问。

首先明确一个概念,OpenResty 是 Nginx 和 Lua 的结合体,而非 Nginx 的扩展。普通的nginx无法编写lua脚本,但OpenResty可以做到。如果之前机器上安装过了 Nginx,建议是先卸载掉再安装OpenResty

步骤1:创建verify_token.lua脚本:

-- 获取请求头
local headers = ngx.req.get_headers()
-- 获得请求头中的 token 参数
local token = headers["token"]
if token then
    -- 这里连接了本地redis,如果有密码,需要加上 -a 参数
    local cmd = "redis-cli -h 127.0.0.1 -p 6379 -n 0 get "..token
    local f = io.popen(cmd)
    res = tostring(f:read())
    f:close()
    -- 这里判断 redis 中是否存在 token
    if res ~= " " then
        -- 在这里可以加一些复杂逻辑
        return "URL A"
    else
        return "URL B"
    end
else
    return "URL C"
end

步骤2在 nginx.conf 文件中加入配置:

server {
        listen       8005;
        server_name  localhost;

        location / {
            resolver 8.8.8.8;
            set_by_lua_file $full_proxy_pass 绝对路径/verify_token.lua;

            proxy_set_header Host $proxy_host;
            proxy_pass  $full_proxy_pass;
        }
    }

注意这里有两个关键配置,如果不加上,跳转的时候就会报404错误

关键配置1

proxy_set_header Host $proxy_host;

语法

proxy_set_header field value;

默认值

proxy_set_header Host $proxy_host;

proxy_set_header Connection close;

上下文

http, server, location

proxy_set_header 允许重新定义或者添加发往后端服务器的请求头。

value可以包含文本、变量或者它们的组合。

当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

所以上述 nginx.conf 如果不重新定义 proxy_set_header Host 的话,那么默认 Host 值就还是当前访问路径的 Host 信息。

关键配置2

resolver 8.8.8.8;

反向代理的场景下,upstream后端用域名时,配置resolver以便于nginx能够解析该域名。

平时我们在配置NG upstream 时,一般都是指定 IP 地址或者是地址池,或者是一个固定的域名。

但一些复杂的场景,比如我们的 upstream 是变量的 servername,这时候需要用到resolver 的指令用来对变量做解析了。

 

文章来自个人专栏
存储专栏
89 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0