如果客户端不支持身份验证标头,如何进行身份验证?

时间:2021-03-20 21:55:14

标签: authentication nginx post request nginx-config

TL;DR:如果客户端不支持身份验证标头,如何对 NGINX 进行身份验证?

我正在构建一个物联网相关项目,使用 NGINX 作为服务器端服务的反向代理,并使用 1NCE 作为移动设备的 LTE 载体。所有流量都基于 HTTPBasicAuth 通过 SSL 加密连接进行身份验证,并根据需要处理“正常”请求。

由于移动服务可能会中断并且互联网连接可能会丢失,我想发送 SMS 以获取关键状态报告和警报通知。 1NCE supports SMS mobile originated SMS (MO SMS) 由 1NCE 的内部基础设施处理并转发到可配置的 API 端点。因此,MO 短信不会发送到指定的电话,而是通过我需要在我这边处理的 API 请求转发。

根据 1NCE's SMS documentation 并与他们的客户支持协商,SMS 转发不支持任何身份验证标头。 SMS 转发只能通过指定 HTTPS URL(包括所需的 API 端点)和端口来完成。然后,传入的 SMS 被包装在对给定 URL 的请求中,并在请求正文中发送。

我还想向 SMS 转发端点(在我这边接收转发的 SMS)添加身份验证,目前我想知道如何实现这一点。 NGINX 支持 authentication on subrequest,可用于评估内部服务的传入请求。所以我的第一个想法是为每个 SMS 添加一些凭据(因为我还负责在移动设备上发送部分代码的 SMS,我可以实现任何需要的东西)并使用 NGINX 的子请求调用的内部服务检查这些凭据.然而,这似乎并不可行。根据 this SO question GET 请求用于内部子请求,因此传入 POST 请求的任何主体都将被丢弃。因此,转发的 SMS 的凭据也无法用于我的内部身份验证服务。通过编写基于 Lua 的自定义插件来扩展 NGINX 的身份验证功能是我的第二个想法,但这不仅似乎不可行,而且我正在使用的 NGINX 实例也不支持(Lua modules 已禁用,切换到openresty 似乎是一件大事)。

我的最后一个想法是将所有传入请求转发到 Python Web 服务(用 Flask 编写,我使用的其他服务也是用 Flask 编写的)并用 Python 解析转发的 SMS。根据凭据评估的结果,如果 SMS(请求正文的一部分)中提供的凭据无效,我可以返回 401/Unauthorized 状态代码,否则处理请求。但是,我认为这种方法非常丑陋,因为所有传入请求都需要传递给 Flask,并且在我的反向代理级别不会拒绝无效请求。

您对如何解决这个问题有什么想法吗?关于“最佳实践”的重要方法是什么?我可以通过某种方式扩展 NGINX 来解决这个问题,还是应该完全放弃 NGINX 以支持“更好的”代理?

0 个答案:

没有答案