2017-09-04 56 views
0

我有一个Django REST后端,它有一个/users端点,我可以通过前端的POST方法添加新用户。Django REST框架中的用户认证

/users端点URL:

http://192.168.201.211:8024/users/

在此终结,我可以查看所有用户的信息,并添加新的用户,所以我必须避免别人进入它除了管理员。我创建了一个超级用户admin和密码。

我的问题是,如果我想要做的,从前端一个HTTP POST(我用角),我必须通过管理员的用户名和密码,adminadmin123,与POST头信息。所以我让别人知道检查前端源代码的用户名和密码。

有没有其他办法可以做到这一点Authentication而不暴露管理员的用户名和密码给他人?

+0

为什么你会硬编码的管理员凭据到前端? – Zachscs

+0

如果新用户想要注册而不是管理员,我该如何处理? – Belter

回答

0

您需要创建一个处理用户创建的API。这就是我们创建后端的原因。用户将向其发送API凭证,API将使用管理凭证和发布请求将用户添加到数据库。 API的代码将不可见。根据您的需要,auth0可以是一个很好的解决方案,并节省您在用户注册和登录上的时间。如果您自己注册并登录,请务必密码并确保它们是通过SSL发送的。像auth0这样的服务将为你处理所有这些,如果你想专注于你的项目的其他部分。

+0

你的意思是我需要创建另一个端点而不是'http://192.168.201.211:8024/users /'?像'/ create_user /'一样,然后用手将新用户添加到db中,而不是使用django REST'ModelViewSet'来添加使用。 – Belter

+0

让我们说/ create_user /接收发布请求,然后将该数据发布到django REST ModelViewSet以添加用户。 – Zachscs

+0

我们如何在Django的'view'函数中做'POST'?我的意思是'POST'总是从frondend到后端,对吧? – Belter

0

token auth是可能你需要什么,我使用令牌身份验证的DRF作为后端和角度为前端

+0

我可以使用'token = Token.objects。创建(user ='admin')'得到'admin'的标记,然后使用这个标记做一个'POST'吧? – Belter

+0

用户登录成功需要返回一个令牌给用户客户端,此后,客户端的所有请求都需要添加一个如'授权'的头部格式:'令牌7582b1089cb8fd605d03fe70bcd0ee7c2f7cxf14',然后TokenAuthentication会通过后端头部标识用户身份 – Ykh

+0

如果你是DRF和令牌认证的新手,[django-rest-framework-jwt](https://github.com/GetBlimp/django-rest-framework-jwt)必须帮助 – Ykh

0

最后,我找到解决这个问题的方法。

这里有一个非常优雅的方式来做到这一点,在我的UserViewSet改写get_queryset功能:

class UserViewSet(viewsets.ModelViewSet): 

    # permission_classes = (permissions.IsAdminUser,) 
    permission_classes = (permissions.AllowAny,) # <-- change 1 
    # queryset = User.objects.all() # <-- change 2 
    serializer_class = UserSerializer 

    def get_queryset(self): 
     queryset = User.objects.filter(id=self.request.user.id) 
     if self.request.user.is_superuser: 
      queryset = User.objects.all() 
     return queryset 

在变化1,权限,允许任何人访问,所以新用户可以做一个POST没有任何身份验证。

在更改2中,当用户是超级用户时,我只返回所有用户,就像重写了get_queryset完成一样。

还需要更改urls.py文件中添加base_name这个网址是这样的:

router.register(r'users', UserViewSet, base_name='user') 

裁判,https://stackoverflow.com/a/22767325/2803344