Zammad与基本身份验证层平滑集成。 因此,永远不会使用状态代码“ HTTP 401未经授权”。 作为替代,状态码403将是适当的替代。
总体而言,与基本身份验证结合使用时,Zammad的问题并不多。 但是在少数情况下,请求将以状态码401应答,并且当前用户被迫重新输入其基本身份验证凭据。
可以轻松地在代码库中搜索状态401(或unauthorized
):
https://github.com/zammad/zammad/search?l=Ruby&q=%3Aunauthorized
然后
或者
是的,我确定这是一个错误,没有功能要求或一般性问题。
请更新您的第一篇文章,以保留您的确切安装信息-“ any”在这一点上并不适合-抱歉。 :)
另外,请务必提供完整的网络服务器配置(并让我们知道您使用的是哪个服务器)。 现在,它闻起来有点像技术问题,但我想完全确定一下。 但是,为此,我需要一切。 ;)
谢谢。
你好,我们又见面了,
我更新了问题描述-最初缺少该描述!
最好的
感谢更新。 您的网络服务器的配置是我们的默认配置,由基本身份验证扩展吗? 您介意也提供该vhost配置吗? 只是为了确保我没有错过任何东西。
谢谢!
是的,它基本上只是Zammad默认配置+基本身份验证。 这是vhost配置:
auth_basic 'Restricted: general basic auth';
auth_basic_user_file /etc/.htpasswd.d/zammad;
location /ws {
proxy_pass http://zammad_ws;
proxy_redirect off;
proxy_hide_header X-Powered-By;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header CLIENT_IP $remote_addr;
proxy_read_timeout 86400;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
error_page 502 503 504 =503 @fallback;
}
location / {
try_files $uri @proxy;
}
location <strong i="6">@proxy</strong> {
proxy_pass http://zammad;
proxy_redirect off;
proxy_hide_header X-Powered-By;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_set_header CLIENT_IP $remote_addr;
error_page 502 503 504 =503 @fallback;
}
我们再次调查了这一点。
我们的猜测(如Michael所写)将不是返回HTTP 401(这使浏览器认为给定的基本身份验证凭据不正确),而是返回被禁止的HTTP 403。
如果我没看错的话,那就意味着
app / controllers / application_controller / handles_errors.rb#L39
respond_to_exception(e, :unauthorized)
应该替换为respond_to_exception(e, :forbidden)
RFC表示浏览器的行为应有所不同(https://tools.ietf.org/html/rfc7231#section-6.5.3):“如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限。客户端应不会自动使用相同的凭据重复该请求。”
不过,上周我们在另一个项目中遇到了同样的问题,并且有403个作品。
如果您看不到其他问题,请返回403,我们可以发出PR。
最好的
很抱歉花了这么长时间。
请注意,这不是Zammad相关问题(基于应用程序),而是nginx上的“后端问题”。
基本身份验证的身份验证请求不会在应用程序时到达Zammad,但已经结束(并由您的Nginx或您要使用的任何其他Web服务器检查)。
因此,我认为更改源代码根本无法解决您的问题。
从技术上讲,根据我的判断,未经授权的401是正确的(即使我了解您想要403)。
也可以看看:
https://serverfault.com/questions/616770/nginx-auth-basic-401-htpasswd
顺便一提:
为了仔细检查,我完全注释掉了Zammad代理部分,以确保Zammad的后端无法回复。 401的结果相同,因此是nginx的错误。 :)
结束操作不是一个错误,而是一个技术问题。
嗨@MrGeneration ,
感谢您查看这个。
虽然我了解到Zammad应用程序似乎无法解决此问题,但我仍然认为它是由它引起的(而不是Ngnix)。 我将尝试解释原因:
假设我们将ngnix配置为_not_以使用基本身份验证。 在这种情况下,我们俩都同意Zammad应用程序(在ngnix的“后面”)可以正常工作。
现在,我们通过将上述配置添加到我们的ngnix中来启用基本身份验证。 请注意,即使到现在,几乎所有内容仍能按预期工作-包括身份验证(基本登录和Zammad登录)以及Zammad应用程序本身。
我尝试早些时候描述的问题有时是稍后(由Zammad!)引起的,当应用程序呈现状态代码为401的页面时。在这种情况下,启用基本身份验证的_any webserver_被强制注销。
我同意在这种情况下从语义上讲401听起来很“正确”。 从技术上讲,它会导致基本身份验证不可避免的问题,应将其替换为403。
请重新打开此问题,因为它可能还会影响许多用户的Zammad应用程序的用户体验。
@thorsteneckel您对此有何看法?
大家好! 感谢您提供宝贵的信息和说明。 我阅读了RFC,但对401和403之间的区别仍然有些困惑。但是,我在StackOverflow上找到了很好的解释。 引用:
401未经授权(HTTP身份验证错误的状态代码)存在问题。 就是这样:它用于身份验证,而不是授权。
这就是重点。 Zammad使用401来处理authorization
错误。 从技术上讲这是错误的,因此是错误。 我将重新讨论这个问题。
但是,我们需要检查影响。 由于所有实现和API使用者,我认为这是一个重大变化。
我当前的计划是使用Zammad 3.4软弃用401 authorization
,使用3.5(或3.6)硬弃用它,然后切换到403。
我们需要在内部进行进一步讨论。
对这个人有进一步的想法吗?
那些是好消息! 听起来不错。
为了使您保持循环:我们将在即将发布的4.0版本中实现此功能。
出于内部实施目的: https :
已通过上面的提交修复。 我们抓住了机会,改进了一些401
错误消息,但基本上我们唯一更改的是将非身份验证错误更改为403 Forbidden
。
您可以在大约30分钟后使用最新的develop
软件包进行测试。 请注意,这是一个正在运行的分支,并且不稳定。 因此,请确保进行备份,并预见最坏的情况:)期待听到您的反馈!
最有用的评论
大家好! 感谢您提供宝贵的信息和说明。 我阅读了RFC,但对401和403之间的区别仍然有些困惑。但是,我在StackOverflow上找到了很好的解释。 引用:
这就是重点。 Zammad使用401来处理
authorization
错误。 从技术上讲这是错误的,因此是错误。 我将重新讨论这个问题。但是,我们需要检查影响。 由于所有实现和API使用者,我认为这是一个重大变化。
我当前的计划是使用Zammad 3.4软弃用401
authorization
,使用3.5(或3.6)硬弃用它,然后切换到403。我们需要在内部进行进一步讨论。
对这个人有进一步的想法吗?