授权凭证已剥离-django,弹性beantalk,oauth


79

我在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 Elastic beantalk实例时,我收到了:

{ "detail" : "Authentication credentials were not provided." }

6
你是我的英雄。我在此上浪费了很多时间,但我相信您为我节省了更多!
2014年

您应该自己回答问题,这样它就不会出现在未答复的列表中:)

1
我不知道这会花掉我多少时间,但是我很确定会花一段时间。救生员。
Tom Manterfield 2014年

仍在2020
凯尔

你节省了我的时间。我不知道我整夜熬了多少天。哈...非常感谢。祝你有美好的一天,我真的爱你。到2020年7月,仍在节省大量时间!大声笑
蒂姆

Answers:


30

我现在使用略有不同的方法。只要汤姆·迪金(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上懒惰并手工清理。
sahutchi 2015年

3
仍然相关的答案。想要添加(作为新手aws用户),您只需在container_commands的顶部将commands标记添加到.ebextensions .config文件中,它将起作用。有关此处处理的所有标签的更多信息:链接
sean.hudson

这有两个问题:1)仅在第二次及以后的部署中起作用,2)sed每次部署时都会在同一行上不断堆积到配置文件中。Manel Clos的解决方案(在Apache的conf.d中创建一个新文件)不受这些问题的困扰,并且在更改环境变量时也可以使用。
Mike Placentra '17

1
我已经有一段时间没有使用EB了,但是我同意他的解决方案更干净,更优雅。如果可以正常运行,我可能会使用它。
鲁本硬脑膜塔里

你救了我的队周末。非常感谢!
Atul Mishra

63

我喜欢在标准位置进行一些额外配置的想法。在您的.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


7
这是一个干净的解决方案。当您更改环境变量时,它确实起作用,并且每次部署时,它不会一直将同一行添加到配置文件中。
迈克·普拉森特拉

得到这个错误:not authorized to perform: rds:DescribeDBEngineVersions
Chirag Maliwal

34

我认为问题出在我在Django中的配置或其他错误类型,而不是关注本地主机和EB之间的差异。问题在于EB的Apache设置。

WSGIPassAuthorization本机设置为OFF,因此必须将其打开。这可以通过添加以下命令,在.ebextensions文件夹中的* .config文件中完成:

container_commands:
  01_wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'

请让我知道我是否错过了某件事,或者是否有更好的方法来解决这个问题。我在网络上的任何地方都找不到关于此的任何具体信息,并认为这可以节省一些时间进行故障排除,然后变得愚蠢。


5
在上述评论中,我似乎讲得太早了。尽管这确实适用于初始部署,但是如果您在环境中进行了某些更改(例如,添加新变量),则在应用这些更改时不会运行该命令,并且看起来仍会重新生成wsg​​i.conf。难道您不知道每次更改时都会运行任何应用程序配置吗?
Tom Manterfield 2014年

我将其包含在每个git aws.push中。但是,是的,当我更改参数时,有时会丢失CSS。如果对环境进行了更改,然后通过环境-应用程序版本菜单中的ui重新部署了最后一次推送,您的应用程序是否会中断?
sahutchi 2014年

看来此修复程序已过期。鲁本·杜拉·塔里(RubénDuráTarí)的亚军答案有效(如果您解决了错字问题),从表面上看,它似乎更可靠。
skolsuper 2015年

@skolsuper的错字是什么?
Nate

1
@Nate没有一个。当我测试它时,我遇到了一个不相关的问题,即我在“纠正”错字的同时无意中修复了问题。自从我进行宴会以来,鲁宾已经将答案修改回工作状态。
Skolsuper,2016年

0

尽管上述解决方案很有趣,但是还有另一种方法。保留要在.ebextensions中使用的wsgi.conf VirtualHost配置文件,并在部署后挂钩中覆盖它(您无法进行此预部署,因为它将重新生成(是的,我发现这很困难)如果这样做,要重新启动,请确保使用超级用户程序重新启动,以正确设置所有环境变量(我也很难做到这一点。)

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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.