【NGINX--5】身份验证
1、HTTP 基本身份验证
需要通过 HTTP 基本身份验证保护应用或内容。
生成以下格式的文件,其中的密码使用某个受支持的格式进行了加密或哈希处理:
# comment
name1:password1
name2:password2:comment
name3:password3
第一个字段是用户名,第二个字段是密码,冒号是分隔符。第三个字段为可选项,您可以使用该字段对每个用户进行评论。NGINX 能理解几种不同的密码格式,其中一个是使用 C 函数 crypt() 加密的密码。该函数通过 openssl passwd 命令暴露在命令行中。安装 openssl 后,您可以使用以下命令创建加密的密码字符串:
$ openssl passwd MyPassword1234
输出结果将是一个字符串,可供 NGINX 在密码文件中使用。
在 NGINX 配置中使用 auth_basic 和 auth_basic_user_file 指令,实现基本身份验证:
location / {auth_basic "Private site"; auth_basic_user_file conf.d/passwd;
}
您可以在 http、server 或 location 上下文中使用 auth_basic 指令。auth_basic 指令带一个字符串参数,如有未经授权的用户访问,该参数将显示在基本身份验证弹窗中。auth_basic_user_file 指定了用户文件的路径。
如要测试配置,您可以使用带 -u 或 --user 标志的 curl 来构建请求的 Authorization 请
求头:
$ curl --user myuser:MyPassword1234 https://localhost
详解
您可以通过几种方式生成具有不同格式和安全等级的基本身份验证密码。Apache 的htpasswd 命令也可以生成密码。openssl 和 htpasswd 都可以使用 apr1 算法生成密码,并且 NGINX 也能理解这种格式的密码。该密码也可以是轻型目录访问协议(LDAP)和 Dovecot 使用的 Salted SHA-1 格式。NGINX 支持其他更多格式和哈希算法;然而,许多算法容易遭到暴力破解攻击,因此人们认为这些算法不安全。
您可以使用基本身份验证来保护整个 NGINX 主机的上下文、特定的虚拟服务器甚至只是特定的 location 代码块。基本身份验证不会取代 Web 应用的用户身份验证,但可以保护私人信息的安全。实际上,基本身份验证是由服务器返回 401 Unauthorized HTTP 代码和响应头 WWW-Authenticate 完成的。该响应头的值为Basic realm=“your string”。收到此响应后,浏览器将提示输入用户名和密码。用户名和密码用冒号连接和分隔,然后用 base64 编码,最后在名为 Authorization 的请求头中发送。Authorization 请求头将指定一个 Basic 和 user:password 编码字符串。服务器对请求头进行解码,并根据提供的 auth_basic_user_file 进行验证。由于用户名和密码字符串仅通过 base64 编码,我们建议在基本身份验证中使用 HTTPS。
2、身份验证子请求
希望通过第三方身份验证系对请求进行身份验证。
使用 http_auth_request_module 请求访问身份验证服务,在响应请求之前验证身份:
location /private/ { auth_request /auth;auth_request_set $auth_status $upstream_status;
}
location = /auth { internal;proxy_pass http://auth-server; proxy_pass_request_body off; proxy_set_header Content-Length "";proxy_set_header X-Original-URI $request_uri;
}
auth_request 指令带一个 URI 参数,该参数必须是本地内部位置。auth_request_set 指令允许您设置身份验证子请求的变量。
详解
http_auth_request_module 可验证 NGINX 服务器处理的每个请求的身份。该模块将使用子请求来确定是否授予请求访问权。子请求是指 NGINX 将请求传递给内部替代位置,并在将请求路由到目的地之前观察它的响应。auth 位置将原始请求(包括正文和请求头)传递到身份验证服务器。子请求的 HTTP 状态码决定是否授予请求访问权。如果子请求返回 HTTP 200 状态码,则表示身份验证成功,请求已完成。如果子请求返回HTTP 401 或 403,则原始请求也将返回 HTTP 401 或 403。
如果您的身份验证服务未请求请求正文,则可以使用 proxy_pass_request_body 指令删除请求正文,如上所示。这种做法可减少请求的大小和时间。由于响应正文被丢弃,Content-Length 请求头必须设置为空字符串。如果身份验证服务需要知道请求访问的URI,则需要将该值放入身份验证服务检查和验证的自定义请求头中。如果您确实希望将子请求中的某些内容保留给身份验证服务(例如响应头或其他信息),您可以使用auth_request_set 指令从响应数据中创建新的变量。
3、使用 NGINX Plus 验证 JWT
需要在使用 NGINX Plus 处理请求之前验证 JWT。
使用 NGINX Plus 的 HTTP JWT 身份验证模块来验证令牌签名,并将 JWT 声明和请求头作为 NGINX 变量嵌入:
location /api/ {auth_jwt "api"; auth_jwt_key_file conf/keys.json;
}
此配置可以验证该位置的 JWT。auth_jwt 指令传递一个字符串,该字符串被用作身份验证领域。auth_jwt 配置带一个保存 JWT 的变量的可选令牌参数。默认情况下,根据JWT 标准使用 Authentication 请求头。auth_jwt 指令还可用于从继承的配置中消除所需的 JWT 身份验证的影响。要关闭(off)身份验证,只需将关键字传递给 auth_jwt 指令。要取消继承的身份验证要求,只需将 off 关键字传递到 auth_jwt 指令。auth_jwt_key_file 带一个参数。该参数是采用标准 JSON Web Key(JWK)格式的密钥文件的路径。
详解
NGINX Plus 支持验证 JSON Web 签名类型的令牌,而不是将整个令牌进行加密的JSON Web 加密类型。NGINX Plus 支持验证使用 HS256、RS256 和 ES256 算法签名的签名。使用 NGINX Plus 验证令牌可以节省向身份验证服务发出子请求所需的时间和资源。NGINX Plus 可破解 JWT 请求头和有效载荷,并将标准请求头和声明捕获到嵌入式变量中,供您使用。auth_jwt 指令可在 http、server、location 及 limit_except 上下文中使用。
参考资料
RFC JSON Web Signature 标准文档
RFC JSON Web 算法标准文档
RFC JSON Web Token 标准文档
NGINX Plus JWT 身份验证
“借助 JWT 和 NGINX Plus 验证 API 客户端身份”
4、创建 JSON Web Key
需要使用 JSON Web Key(JWK)才能使用 NGINX Plus。
NGINX Plus 使用 RFC 标准中指定的 JWK 格式。该标准允许在 JWK 文件中包含一个关键对象数组。
以下是该密钥文件的示例:
{"keys":[{"kty":"oct","kid":"0001","k":"OctetSequenceKeyValue"},{"kty":"EC","kid":"0002""crv":"P-256","x": "XCoordinateValue","y": "YCoordinateValue","d": "PrivateExponent","use": "sig"},{"kty":"RSA","kid":"0003""n": "Modulus","e": "Exponent","d": "PrivateExponent"}]
}
所示的 JWK 文件演示了 RFC 标准中指出的三类初始密钥。这些密钥的格式也是 RFC 标准的一部分。kty 属性是密钥类型。该文件显示了三种密钥类型:Octet Sequence(oct)、EllipticCurve(EC)和 RSA 类型。kid 属性是密钥 ID。这些密钥的标准中指定了其他属性。更多信息请查看这些标准的 RFC 文档。
详解
有许多提供不同语言的库可以生成 JWK。建议创建一个密钥服务,作为 JWK 的中央权限,以定期创建和轮换您的 JWK。为了增强安全性,建议让 JWK 与 SSL/TLS 证书一样安全。使用适当的用户和组权限保护密钥文件。最好将它们保存在主机的内存中。您可以通过创建类似 ramfs 的内存文件系统来实现。定期轮换密钥也很重要;您可以选择创建一个密钥服务来创建公钥和私钥,并通过 API 将它们提供给应用和 NGINX。
参考资料
RFC JSON Web Key 标准文档
5、使用 NGINX Plus 验证 JSON Web Token
使用 NGINX Plus 验证 JSON Web Token。
使用 NGINX Plus 自带的 JWT 模块保护位置或服务器,并指示 airt_jwt 指令使用$cookie_auth_token 作为要验证的令牌:
location /private/ {auth_jwt "Google Oauth" token=$cookie_auth_token; auth_jwt_key_file /etc/nginx/google_certs.jwk;
}
此配置指示 NGINX Plus 通过 JWT 验证保护 /private/ URI 路径。Google OAuth 2.0 OpenID Connect 使用 cookie auth_token 而不是默认的 bearer 令牌。因此,您必须指示 NGINX 在此 cookie 中查找令牌,而不是在 NGINX Plus 的默认位置中查找。我们将在实操指南 6.6 中介绍如何将 auth_jwt_key_file 位置设置为任意路径。
详解
此配置说明了如何使用 NGINX Plus 验证 Google OAuth 2.0 OpenID Connect JWT。NGINX Plus 的 HTTP JWT 身份验证模块支持验证符合 RFC JSON Web Signature 规范的 JWT,允许任何使用 JWT 的 SSO 授权立即在 NGINX Plus 层中进行验证。OpenID 1.0 协议层位于 OAuth 的上面。OpenID 2.0 身份验证协议添加了身份,支持使用 JWT 来证明发送请求的用户的身份。NGINX Plus 可通过令牌的签名验证令牌自签名以来是否经过修改。这允许 Google 使用一种异步签名方法,可在保护其私人JWK 的同时分发公共 JWK。
参考资料
“借助 JWT 和 NGINX Plus 验证 API 客户端身份”
6、使用 NGINX Plus 自动获取和缓存 JSON Web Key Set
希望 NGINX Plus 自动请求提供商的 JSON Web Key Set(JWKS)并进行缓存。
利用缓存区和 auth_jwt_key_request 指令自动更新密钥:
proxy_cache_path /data/nginx/cache levels=1 keys_zone=foo:10m;
server {# ...location / {auth_jwt "closed site";auth_jwt_key_request /jwks_uri;}location = /jwks_uri {internal;proxy_cache foo;proxy_pass https://idp.example.com/keys;}
}
在此示例中,auth_jwt_key_request 指令指示 NGINX Plus 从内部子请求中检索 JWK。该子请求被定向到 /jwks_uri,后者将请求代理给身份提供商。默认请求缓存时间为 10 分钟,以限制开销。
详解
NGINX Plus R17 中引入了 auth_jwt_key_request 指令。此功能支持 NGINX Plus 服务器在发出请求时动态更新其 JWK。使用子请求方法来获取 JWK,这意味着指令指向的位置必须是 NGINX Plus 服务器本地的位置。在上面的示例中,子请求的位置被锁定,以确保仅响应内部的 NGINX Plus 请求。还可使用缓存来确保仅在必要时发出 JWK 检索请求,并且不会导致身份提供商过载。auth_jwt_key_request 指令在 http、server、location 和 limit_except 上下文中有效。
参考资料
“借助 JWT 和 NGINX Plus 验证 API 客户端身份”
NGINX Plus“借助 JSON Web Key Set 缓存加快 JWT 验证”
7、使用 NGINX Plus 通过现有的 OpenID Connect SSO 验证用户身份
希望将 NGINX Plus 与 OpenID Connect(OIDC)身份提供商集成在一起。
该解决方案由许多配置要素和一些 NGINX JavaScript 代码组成。身份提供商(IdP)必须支持 OpenID Connect 1.0。NGINX Plus 将在授权代码流中充当 OIDC 的中继方。NGINX Inc. 维护了一个 GitHub 公共仓库,该仓库包含作为 OIDC 与 NGINX Plus 集成参考实现的配置和代码。“其他参考资料”部分中的仓库链接提供了关于如何使用自己的 IdP 设置参考实现的最新说明。
详解
该解决方案只与参考实现有关,可确保各位读者拥有最新的解决方案。提供的参考将NGINX Plus 配置为 OpenID Connect 1.0 授权代码流的中继方。在此配置中,如果将对受保护资源未经授权的请求发送到 NGINX Plus,NGINX Plus 首先会将该请求重定向到 IdP。IdP 会让客户端完成自己的登录流程,然后向 NGINX Plus 返回一个身份验证代码。然后,NGINX Plus 直接与 IdP 通信,用身份验证代码交换一组 ID 令牌。这些令牌使用 JWT 进行验证,并存储在 NGINX Plus 的键值(key-value)存储中。通过使用键值存储,采用高可用性(HA)配置的所有 NGINX Plus 节点都能获得这组令牌。在这个过程中,NGINX Plus 为客户端生成了一个会话 cookie,该 cookie 被用于在键值存储中查找令牌的密钥。然后,客户端的 cookie 被重定向到初始请求的资源。随后的请求将通过使用 cookie 查找 NGINX Plus 键值存储中的 ID 令牌来进行验证。
该功能支持与大多数主要身份提供商进行集成,包括 CA 单点登录(以前称为SiteMinder)、ForgeRock OpenAM、Keycloak、Okta、OneLogin 和 Ping Identity。作为一项标准,OIDC 与身份验证密切相关 —— 前面提到的身份提供商只是可能集成的一个子集。
参考资料
“借助 OpenID Connect 和 NGINX Plus 对访问当前应用的用户进行身份验证”
OpenID Connect
NGINX OpenID Connect GitHub
相关文章:
【NGINX--5】身份验证
1、HTTP 基本身份验证 需要通过 HTTP 基本身份验证保护应用或内容。 生成以下格式的文件,其中的密码使用某个受支持的格式进行了加密或哈希处理: # comment name1:password1 name2:password2:comment name3:password3第一个字段是用户名࿰…...
【网络奇缘】- 计算机网络|分层结构|ISO模型
🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 📝全文…...
使用whisper实现语音转文本
项目地址:GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision 1、需要py3.8环境 conda activate p38 2、安装 pip install -U openai-whisper 3、下载项目 pip install githttps://github.com/openai/whisper.git 4、安装…...
Django中间件与csrf
一. django中间件 1. 什么是django中间件 # django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去 2. django中间件的个数 django自带七个中间件, 分别是SecurityMiddleware, SessionMiddle…...
【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备
Virtuose 6D RV为一款具有大工作空间并在所有6自由度上提供力反馈的触觉设备,设计专用于虚拟现实环境,特别适合于大型虚拟物体的处理。 Virtuose 6D RV是当今市场上唯一将高工作效率与高工作量相结合在一起的产品。6D RV特别适合于缩放与操纵等应用&…...
<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?
目录 一、线程(Thread)的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程(Thread)的…...
【赠书第7期】从零基础到精通Flutter开发
文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…...
《golang设计模式》第三部分·行为型模式-07-观察者模式(Observer)/发布者—订阅者模式
文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 代码2.2 类图 1. 概念 观察者(Observer)指当目标对象状态发生变化后,对状态变化事件进行响应或处理的对象。 1.1 角色 Subject(抽象主题): 它可以有多…...
Maven中常用命令以及idea中使用maven指南
文章目录 Maven 常用命令compiletestcleanpackageinstallMaven 指令的生命周期maven 的概念模型 idea 开发maven 项目idea 的maven 配置idea 中创建一个maven 的web 工程在pom.xml 文件添加坐标坐标的来源方式依赖范围编写servlet maven 工程运行调试 Maven 常用命令 compile …...
深度学习之八(生成对抗网络--Generative Adversarial Networks,GANs)
概念 生成对抗网络(Generative Adversarial Networks, GANs)是一种深度学习模型,由 Ian Goodfellow 等人于2014年提出。GAN 的目标是通过训练两个神经网络(生成器和判别器),使得生成器能够生成与真实数据相似的样本,而判别器能够区分真实样本和生成样本。这两个网络相…...
内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识
目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…...
Linux python安装 虚拟环境 virtualenv
根目录创建 venvs 文件夹 sudo mkdir /venvs 进入 /venvs 目录 cd /venvsp 创建虚拟环境,前提要按照 python3 安装 的 命令 sudo apt install python3 sudo python3 -m venv 虚拟环境名 激活虚拟环境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安装flask pip…...
洛谷 P1883 函数
P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的,过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分,但是我随便画了几个f(x)之后发现好像…...
【C++心愿便利店】No.14---C++之探索list底层原理
文章目录 前言一、list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list operations1.2.7 list的迭代器失效 二、list的模拟实现2.1 定义一个结构体实现list的…...
【广州华锐互动】VR防溺水安全内容体验提高群众防溺水意识
在全球各地,溺水是导致儿童和青少年死亡的主要原因之一。据世界卫生组织的统计,全球每年有超过36万人因溺水而死亡,其中大部分是儿童和青少年。因此,提供有效的防溺水教育和培训至关重要。随着科技的发展,虚拟现实&…...
【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块
文章目录 游戏模块基础功能模块定时器模块日志模块通用模块 游戏模块 游戏从逻辑方面可以分为下面几个模块: 注册和登录网络协议数据库玩法逻辑其他通用模块 除了逻辑划分,还有几个重要的工具类模块: Excel 配置导表工具GM 指令测试机器人…...
python内置模块binascii,二进制数据和ASCII字符串之间进行转换
一、简介 binascii是Python标准库中的一个模块,提供了在二进制数据和ASCII字符串之间进行转换的功能。它包含了一些用于处理二进制数据的函数,可以进行二进制数据的编码、解码和转换。 二、方法 binascii.unhexlify(hexstr):将十六进制表示…...
如何开启MySQL的慢查询日志
说明:如果需要查看某一条SQL查询速度慢,并对慢的SQL进行优化,那么开启MySQL慢查询日志是一定要做的事情,本文介绍如何开启MySQL的慢查询日志; 查看MySQL慢查询是否开启 首先,输入下面的命令,查…...
Spine的BoundingBoxAttachment碰撞检测
引擎版本 —— cocos creator 2.3.4 游戏代码: //优先初始化的时候,获取到cc.PhysicsPolygonColliderthis._poly this.dragonFooAni.node.getComponent(cc.PhysicsPolygonCollider);//下面的修改顶点位置的方法可以在update里面去执行//获取骨骼动画上…...
Proteus下仿真AT89C51报“串行口通信失败,请检查电平适配是否正确。”解决办法
在Proteus下进行AT89C51串行口仿真时,如果遇到“串行口通信失败,请检查电平适配是否正确”的错误提示,以下是一些解决办法: 1. 了解AT89C51和外部设备的电平要求: 首先,了解AT89C51和外部设备之间的电平…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
