如何使用Nginx的客户端唯一标识?

Nginx

1 前言

笔者一个项目中需要完成一个带有安全认证的反向代理,整个测试进入最后阶段是如何在Nginx的服务器端正确地标识唯一用户,项目相关文章请参阅,
https://www.cmdschool.org/archives/1996
正是因为这样,笔者才通过研究“ngx_http_userid_module”模块且写下此文并分享。

2 基础知识

2.1 模块的介绍

– “ngx_http_userid_module”模块会设置一个客户端的唯一标识(Cookie)
– 接收和设置该唯一标识可使用嵌入式变量$uid_got和$uid_set
– 该模块与Apache的mod_uid模块兼容

2.2 使用范例

userid         on;
userid_name    uid;
userid_domain  example.com;
userid_path    /;
userid_expires 365d;
userid_p3p     'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';

2.3 具体指令

2.3.1 用户唯一标识的启用或禁用

语  法: userid on | v1 | log | off;
默认值: userid off;
上下文: http, server, location

– on,表示启用用户唯一标识功能(使用版本2的cookies记录接收到的cookies)
– v1,表示使用版本1的cookies记录接收到的cookies
– log,表示禁用cookies的设置但启用记录接收到的cookies
– off,表示禁用cookies的设置和记录收到的cookies

2.3.2 定义唯一标识的域

语  法: userid_domain name | none;
默认值: userid_domain none;
上下文: http, server, location

– name,代表唯一标识(cookies)的域名称
– none,代表禁用cookie的域设置

2.3.3 定义唯一标识的域

语  法: userid_expires time | max | off;
默认值: 	userid_expires off;
上下文: http, server, location

– time,代表浏览器保存cookie的时间
– max,代表cookie的过期时间(例如,31 Dec 2037 23:55:55 GMT)
– off,表示cookie在浏览器会话结束时过期

2.3.4 使用标记

语  法: userid_mark letter | digit | = | off;
默认值: 	userid_mark off;
上下文: http, server, location

– 如果参数为关闭,则启用cookie标记机制并设置标记字符
– 机制将保留客户端标识符的同时添加或更改userid_p3p和/或者cookie过期时间
– 标记可以是英文字母(区分大小写)或数字或“=”字符
– 标记被设置则与cookie中传递的客户端标识(base64形式)的第一个符号进行比较
– 不匹配则重新发送标记、过期时间和“P3P”头

2.3.5 设置cookie名称

语  法: userid_name name;
默认值: 	userid_name uid;
上下文: http, server, location

– name,代表cookie的名称

2.3.6 设置P3P头

语  法: userid_p3p string | none;
默认值: 	userid_p3p none;
上下文: http, server, location

– 设置与Cookie一起发送的“P3P”标题字段的值
– none,代表“P3P”头将不在响应中发送

2.3.7 定义cookie的路径

语  法: userid_path path;
默认值: 	userid_path /;
上下文: http, server, location

– 定义cookie的路径

2.3.8 定义服务器编号

语  法: userid_service number;
默认值: 	userid_service IP address of the server;
上下文: http, server, location

– 该参数用于多服务器环境下确保客户端标识唯一
– 版本1的cookie的默认值是零
– 版本2的cookie的默认值是服务器IP地址的最后四字节组成的数字

2.4 环境变量

2.4.1 客户端标识符

$uid_got

Cookie的名称和收到的客户端标识符

2.4.2 重置客户端标识

$uid_reset

– 该变量被设置为非“0”的非空字符,则客户端标识符将被重置
– 特殊值“log”将会导致重置标识符的消息输出error_log

2.4.3 设置客户端标识

$uid_set

Cookie的名称和发送的客户端标识符

3 实践部分

3.1 搭建实践环境

请按照以下链接搭建测试环境,
https://www.cmdschool.org/archives/1996

3.2 增加带身份标识的配置

proxy_cache_path /data/nginx/cache/one levels=2:2:2  keys_zone=one:10m
                 inactive=24h  max_size=1g;

server {
    listen       80;
    server_name  www.cmdschool.org;

    userid         on;
    userid_name    uid;
    userid_domain  www.cmdschool.org;
    userid_path    /;
    userid_expires 1d;
    userid_p3p     'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';
    #userid_flags   secure httponly;

    set $auth 0;
    if ($uid_got){set $auth 1;}

    location / {
        auth_request /auth;
        if ($auth = 0){return 301 https://$server_name$request_uri;}
        root   /var/www/www.cmdschool.org;
        index  index.html index.htm;
    }

    location = /auth {
        proxy_pass http://auth.cmdschool.org/httpBasicAuth.php;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
        proxy_cache            one;
        proxy_cache_valid      200  1m;
        proxy_cache_valid      403  3s;
        proxy_cache_key $uid_got;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

3.3 重启服务使配置生效

systemctl restart nginx

参阅文档:
=====================

模块的官方文档
——————-
http://nginx.org/en/docs/http/ngx_http_userid_module.html

模块的GIT文档
——————-
https://github.com/swiftype/web_server_uid

如何保持客户端cookie
——————-
https://blog.csdn.net/shimiso/article/details/39033353

没有评论

发表回复

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …

Nginx
如何安装部署RHEL 9 Nignx?

1 前言 一个问题,一篇文章,一出故事。 笔者需要基于RHEL 9部署Nginx环境,于是整理此文。 …