授权证书剥离 – django,弹性beanstalk,oauth

我用django-rest-framework在django中实现了一个REST api,并使用oauth2进行身份validation。

我testing了:

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." } 

我现在使用一个稍微不同的方法。 正如汤姆·迪金指出的那样,只要环境variables没有改变,萨赫奇的解决scheme就可以发挥作用。 我在EB内部深入了一下,发现了wsgi.conf模板的位置,并在那里添加了“WSGIPassAuthorization On”选项。

 commands: WSGIPassAuthorization: command: sed -i.bak '/WSGIScriptAlias/ a WSGIPassAuthorization On' config.py cwd: /opt/elasticbeanstalk/hooks 

即使在改变环境variables的情况下,这也将始终有效。 希望对你有帮助。

编辑:似乎很多人仍然在触及这个回应。 我有一段时间没有使用ElasticBean,但是我会考虑使用下面的Manel Clos解决scheme。 我没有亲自尝试,但似乎是一个更干净的解决scheme。 这个字面上就是对EB脚本的破解,如果EB更新它们,特别是如果将它们移动到不同的位置,可能会在未来破解。

我认为这个问题是在我的configurationDjango或其他错误types,而不是侧重于本地主机和EB之间的差异。 问题是EB的Apache设置。

WSGIPassAuthorization原生设置为OFF,所以它必须打开。 这可以在.ebextensions文件夹的* .config文件中完成,并添加以下命令:

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

请让我知道,如果我错过了什么,或者如果有更好的方法,我应该看看这个问题。 在networking上的任何地方我找不到任何具体的东西,并认为这可能会节省大量的时间,然后感到愚蠢。

我喜欢在标准地方做一些额外configuration的想法。 在您的.ebextensions目录下创build一个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

虽然上面的解决scheme很有趣,但还有另一种方法。 保留你想在.ebextensions中使用的wsgi.conf的VirtualHostconfiguration文件,并在后期部署钩子中覆盖它(你不能做这个预部署,因为它会得到重新生成(是的,我发现了硬如果你这样做,要重新启动,请确保使用supervisorctl程序重新启动,以便正确地设置所有的环境variables(我也发现这很困难)。

 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"