2017-09-04 57 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