django-rest-auth文档讨论了Facebook集成,我对此并不感兴趣 - 我关注的是通过Google提供社交登录.我已经尝试了很长一段时间了,我想知道是否有其他人有关于他们如何做到这一点的任何文件...即使只是粗略的草图也会有所帮助.到目前为止,我还没有找到任何搜索结果.我几乎在那里,但无法使用Django休息框架(DRF)可浏览的API.
以下是我到目前为止的内容:我从django-rest-auth github页面上提供的演示项目开始,修改了社交登录模板HTML页面,只需要'代码'输入,而不是'代码'和'access_token' .当我提供有效的代码(通过单独的请求获得google的auth端点)时,这很好用; 可浏览的API在响应中使用"密钥"(我的应用程序的用户API令牌)呈现通常的网页.检查django管理员,一切正常 - 用户已登录,电子邮件已通过身份验证等.目前为止很好.
问题在于提供"代码"的起点 - 以及我如何从谷歌首先获得该代码.当我以前(成功)使用allauth包时,我只需单击一个链接,该链接将"无形地"执行整个OAuth2流程(即请求代码,使用该代码获取访问令牌,并使用访问令牌获取用户的谷歌帐户信息).
为了重新创建无缝流(即不从代码开始),我想我可以中断OAuth2流并"拦截"从谷歌返回的代码,然后将该代码发布到rest-auth社交登录API.为此,我allauth.socialaccount.providers.oauth2.views.OAuth2CallbackView通过覆盖调度方法创建了一个自定义:
class CustomOAuth2CallbackView(OAuth2CallbackView):
def dispatch(self, request):
# gets the code correctly:
code = request.GET['code']
# rp is of type requests.methods.Response
rp = requests.post(<REST-AUTH API ENDPOINT>, data = {'code':code})
return rp
Run Code Online (Sandbox Code Playgroud)
通常,当谷歌向您最初提供给谷歌的auth端点的回调uri发送GET请求时,会调用此方法.通过此覆盖,我能够成功解析在该回调中从谷歌返回的代码.POST请求有效并且在resp._content字段中具有用户密钥.但是,它最终无法在DRF可浏览API中生成预期视图.
基于在callstack中潜入,我发现rest_framework.views.APIView.dispatch返回一个类型的对象rest_framework.response.Response.但是,当requests.post上面使用的方法完成时,它返回一个类型的实例requests.models.Response.因此,它没有正确的属性,并且在django中间件中失败.例如,它没有acceptable_renderer属性,也没有'get'方法(用于django.middleware.clickjacking.py).可以想象,我可以将这些要求添加到requests.models.Response(rp)实例中,但随后这个黑客变得更加困难.
感谢您的任何帮助,您可以提供!
我的用例与此问题的其他用例略有不同,因此有一点预先描述:
我在 Google Cloud 上工作并且有一个“dockerized”的 Django 应用程序。部分应用程序依赖于使用 gsutil 将文件移入/移出 Google Storage 存储分区。由于各种原因,我们不想使用 Google Container Engine 来管理我们的容器。相反,我们希望通过启动额外的 Google Compute VM 来水平扩展,这些 VM 将依次运行这个 Docker 容器。与https://cloud.google.com/python/tutorials/bookshelf-on-compute-engine类似,除了我们将使用容器而不是拉取 git 存储库。
VM 将从基本的 Debian 映像构建,并且依赖项(例如 Docker 本身)的启动和安装将使用启动脚本(例如gcloud compute instances create some-instance --metadata-from-file startup-script=/path/to/startup.sh)进行编排。
如果我手动创建一个虚拟机,迅速提升用sudo -s,运行gsutil config -f(这将创建在/root/.boto凭证文件),然后运行我的泊坞窗容器(见下文Dockerfile)与
docker run -v /root/.boto:/root/.boto username/gs gsutil ls gs://my-test-bucket
那么它的工作原理。但是,这需要我的交互才能创建 boto 文件。
我的问题是:如何将默认服务凭据传递给将在该新 VM 中启动的 Docker 容器?
gsutil 甚至可以在“新鲜”的 Debian VM 上开箱即用,因为它使用所有 VM 加载的默认计算引擎凭据。有没有办法使用这些凭据并将它们传递给 docker 容器?在新的 VM 上第一次调用 gsutil 后,我注意到它创建了 …
google-cloud-storage google-compute-engine docker google-cloud-platform google-cloud-sdk
基于 Django 设置的配置有很多这样的问题,但我是从安全角度问的——
背景:(显然)这是一个 Django 应用程序,我在 Docker 容器中运行;Gunicorn 正在该容器中运行,并设置为侦听端口 8000 ( gunicorn my_app.wsgi:application --bind 0.0.0.0:8000)。Nginx 面向公众(在 80 上监听)并在单独的容器中运行。Nginx 通过 docker-compose 设置的内部网络将请求发送到 Django 容器。
目前,我正在具有临时 IP 的云计算机上运行它。我已将其添加到我的 ALLOWED_HOSTS 中,以便它读取实际 IP 地址ALLOWED_HOSTS=['XX.XXX.XX.XX']。该应用程序有效。xx.xxx.xx.xx
我的问题: 我的应用程序监控刚刚通知我一个明显的错误,内容如下:
api_1 | 2020-07-29 16:50:24,498 django.security.DisallowedHost.response_for_exception ERROR
Invalid HTTP_HOST header: '0.0.0.0:8000'. You may need to add '0.0.0.0' to ALLOWED_HOSTS.
Run Code Online (Sandbox Code Playgroud)
这不是我提出的请求——可能只是某个机器人。
我实际上应该添加0.0.0.0到吗ALLOWED_HOSTS?或者说这存在安全风险?这会允许虚假请求通过吗?0.0.0.0在我的 Django 应用程序上下文中这意味着什么?如果它只应该接收 nginx 服务器发送的请求,那么这些请求不应该都以 xx.xxx.xx.xx IP 作为主机标头吗?
我不一定希望所有这些机器人/扫描请求都用垃圾填满我的应用程序监控,这似乎不是一个“真正的”错误。我对网络的理解有限,所以如果这是一个简单的问题,我深表歉意。
谢谢!
我仔细研究了几篇类似的帖子(并且从同一项目中的另一个应用程序调用基于类的应用程序视图似乎很有希望,但不起作用),但有些帖子较旧,对我来说没有什么用。这是我的设置(使用 Django==2.0.6,djangorestframework==3.8.2)
我有一个基本模型(此处简化):
from django.db import models
class Resource(models.Model):
name = models.CharField(max_length=100, null=False)
Run Code Online (Sandbox Code Playgroud)
我有一个基本端点,可以在其中列出和创建Resource实例:
from rest_framework import generics, permissions
from myapp.models import Resource
from myapp.serializers import ResourceSerializer
class ListAndCreateResource(generics.ListCreateAPIView):
queryset = Resource.objects.all()
serializer_class = ResourceSerializer
permission_classes = (permissions.IsAuthenticated,)
Run Code Online (Sandbox Code Playgroud)
(afaik,序列化程序的细节不相关,因此被忽略了)。
无论如何,除了那个基本端点之外,我还有另一个 API 端点,它执行一些操作,但也在Resource这个过程中创建一些对象。当然,我想利用ListAndCreateResource类中封装的功能,所以我只需要维护一个Resource创建s的地方。
我试过了:
尝试 1:
class SomeOtherView(generics.CreateAPIView):
def post(self, request, *args, **kwargs):
# ... some other functionality...
# ...
response = ListAndCreateResource().post(request, *args, **kwargs)
# ... more functionality...
return Response({'message': …Run Code Online (Sandbox Code Playgroud)