授权凭证剥离 --- django, elastic beanstalk, oauth
Posted
技术标签:
【中文标题】授权凭证剥离 --- django, elastic beanstalk, oauth【英文标题】:Authorization Credentials Stripped --- django, elastic beanstalk, oauth 【发布时间】:2020-12-22 02:06:44 【问题描述】:我在 django 中使用 django-rest-framework 实现了一个 REST api,并使用 oauth2 进行身份验证。
我测试过:
curl -X POST -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=YOUR_USERNAME&password=YOUR_PASSWORD" http://localhost:8000/oauth2/access_token/
和
curl -H "Authorization: Bearer <your-access-token>" http://localhost:8000/api/
在本地主机上成功,结果与文档一致。
将其推送到现有的 AWS 弹性 beanstalk 实例时,我收到:
"detail" : "Authentication credentials were not provided."
【问题讨论】:
你是我的英雄。我在这上面浪费了很多时间,但我相信你救了我更多! 你应该自己回答你的问题,所以它不会出现在未回答的列表中:) 我不知道这会用掉我多少时间,但我很确定它已经有一段时间了。救生员。 在 2020 年仍然节省时间和时间 你节省了我的时间。我不知道我有多少天真的熬夜了。哈……非常感谢。祝你有美好的一天,我真的很爱你。 2020 年 7 月仍在节省时间!!!!!!!!!!大声笑 【参考方案1】:我认为问题在于我在 django 中的配置或其他一些错误类型,而不是关注 localhost 和 EB 之间的差异。问题在于 EB 的 Apache 设置。
WSGIPassAuthorization 本身设置为 OFF,因此必须将其打开。这可以在 .ebextensions 文件夹中的 *.config 文件中完成,并添加以下命令:
container_commands:
01_wsgipass:
command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
如果我遗漏了什么或者是否有更好的方法来解决问题,请告诉我。我在网络上的任何地方都找不到任何关于此的具体内容,并认为这可能会为某些人节省数小时的故障排除时间,然后感觉很愚蠢。
【讨论】:
似乎我在上面的评论中说得太早了。虽然这确实适用于初始部署,但如果您更改环境中的某些内容(例如添加新变量),则在应用这些更改时不会运行,并且 wsgi.conf 似乎仍在重新生成。不要以为您不知道每次发生更改时都会运行任何应用配置? 我在每个 git aws.push 中都包含了这个。但是,是的,有时我在更改参数时会丢失 css。如果在对环境进行更改后,您通过环境中的 ui - 应用程序版本菜单重新部署最后一次推送,您的应用程序是否会出现任何问题? 看起来这个修复已经过时了。来自 Rubén Durá Tarí 的亚军答案有效(如果您改正了错字),并且从表面上看似乎更可靠。 @skolsuper 错字是什么? @Nate 没有。当我测试它时,我遇到了一个不相关的问题,我在“纠正”错字的同时无意中修复了它。自从我的小丑之后,Rubén 已将他的答案编辑回工作状态。【参考方案2】:我现在使用稍微不同的方法。只要 env 变量没有像 Tom dickin 所指出的那样改变,sahutchi 的解决方案就可以工作。我在 EB 内部挖得更深了,找到了 wsgi.conf 模板所在的位置,并在那里添加了“WSGIPassAuthorization On”选项。
commands:
WSGIPassAuthorization:
command: sed -i.bak '/WSGIScriptAlias/ a WSGIPassAuthorization On' config.py
cwd: /opt/elasticbeanstalk/hooks
这将始终有效,即使更改环境变量也是如此。我希望你觉得它有用。
编辑:似乎很多人仍在点击此回复。我有一段时间没有使用 ElasticBeanstalk,但我会考虑在下面使用 Manel Clos 的解决方案。我没有亲自尝试过,但似乎是一个更清洁的解决方案。这实际上是对 EB 脚本的破解,如果 EB 更新它们,特别是如果它们将它们移动到不同的位置,它可能会在未来中断。
【讨论】:
这很好。现在 awsebcli 有了 eb ssh,我发现它更容易在 dev-ops 上变得懒惰并手动进行清理。 仍然相关的答案。想要添加它(作为新手 aws 用户),您只需将 commands 标签添加到您的 .ebextensions .config 文件中,在您的 container_commands 之上,它就会起作用。有关此处处理的所有标签的更多信息:link 这有两个问题:1) 仅适用于第二次和后续部署,2) 每次部署时,sed 都会在同一行堆积到配置文件中。 Manel Clos 的解决方案(在 Apache 的 conf.d 中创建一个新文件)不会遇到这些问题,并且当您更改环境变量时它也可以工作。 我有一段时间没有使用 EB,但我确实同意他的解决方案更干净、更优雅。如果它工作正常,我可能会使用它。 你在周末拯救了我的团队。非常感谢!【参考方案3】:虽然上述解决方案很有趣,但还有另一种方法。将要使用的 wsgi.conf VirtualHost 配置文件保留在 .ebextensions 中,并在部署后挂钩中覆盖它(您不能在部署前执行此操作,因为它会重新生成(是的,我发现这很难方式)。如果这样做,要重新启动,请确保使用 supervisorctl 程序重新启动,以便正确设置所有环境变量。(我也发现了这一点。)
cp /tmp/wsgi.conf /etc/httpd/conf.d/wsgi.conf
/usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf restart httpd
exit 0
01_python.config:
05_fixwsgiauth:
command: "cp .ebextensions/wsgi.conf /tmp"
【讨论】:
【参考方案4】:我喜欢在标准位置进行一些额外配置的想法。在您的 .ebextensions 目录中创建一个 wsgi_custom.config 文件:
files:
"/etc/httpd/conf.d/wsgihacks.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIPassAuthorization On
此处发布:https://forums.aws.amazon.com/message.jspa?messageID=376244
【讨论】:
这是一个干净的解决方案。当您更改环境变量时它确实有效,并且每次部署时它都不会在配置文件中添加同一行。 收到此错误:not authorized to perform: rds:DescribeDBEngineVersions
以上是关于授权凭证剥离 --- django, elastic beanstalk, oauth的主要内容,如果未能解决你的问题,请参考以下文章
Django TextField 和 CharField 正在剥离空格和空行
来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文
微信开发之分清公众平台和开放平台公众号全局凭证和网页授权凭证
Apache HttpClient DigestAuth - 401,未经授权。但是凭证没问题[重复]