2016-10-01 54 views
0

我想構建一個具有用戶登錄和註冊功能的應用程序。
我可以通過django和DRF創建登錄和註冊,但無法在DRA中掛接oAuth2以使其功能正常。
我不知道應該在哪裏使用它。

我應該在註冊或登錄時生成令牌嗎?
我如何使其功能?掛鉤與DRF oauth2代碼

這裏是我的代碼

serializers.py

class UserSerializer(ModelSerializer): 
    class Meta: 
     model = User 


class UserCreateSerializer(ModelSerializer): 
    email = EmailField() 
    username = CharField() 
    first_name = CharField(required=False) 
    last_name = CharField(required=False) 
    password = CharField() 
    confirm_password = CharField() 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      'email', 
      'first_name', 
      'last_name', 
      'password', 
      'confirm_password' 
     ] 
     extra_kwargs = {"password": {"write_only": True}} 


    def create(self, validated_data): 
     username = validated_data['username'] 
     first_name = validated_data['first_name'] 
     last_name = validated_data['last_name'] 
     email = validated_data['email'] 
     password = validated_data['password'] 
     confirm_password = validated_data['password'] 
     user_obj = User(
       username = username, 
       first_name = first_name, 
       last_name = last_name, 
       email = email 
      ) 
     user_obj.set_password(password) 
     user_obj.save() 
     return validated_data 



class UserLoginSerializer(ModelSerializer): 
    username = CharField() 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      # 'email', 
      'password', 
      # 'token', 

     ] 
     extra_kwargs = {"password": 
          {"write_only": True} 
          } 
    def validate(self, data): 
     return data 

views.py

class UserCreateAPI(CreateAPIView): 
    serializer_class = UserCreateSerializer 
    queryset = User.objects.all() 
    permission_classes = [AllowAny] 

class UserLoginAPI(APIView): 
    permission_classes = [AllowAny] 
    serializer_class = UserLoginSerializer 

    def post(self, request, *args, **kwargs): 
     data = request.data 
     print('data',data) 
     serializer = UserLoginSerializer(data=data) 
     if serializer.is_valid(raise_exception=True): 
      new_data = serializer.data 
      if new_data: 
       try: 
        user = User.objects.get(username=data['username']) 
        print ('user',user) 
       except ObjectDoesNotExist: 
        return HttpResponse("Can't find this user") 
       login(request, user) 
      return Response(new_data, status=status.HTTP_200_OK) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

tools.py

def get_token_json(access_token): 
    return JsonResponse({ 
     'access_token':access_token.token, 
     'expires_in':datetime.now() + timedelta(days=365), 
     'token_type':'Bearer', 
     'refresh_token':access_token.refresh_token.token, 
     'scope':access_token.scope 
    }) 


def get_access_token(user): 
    application = Application.objects.get(name="Foodie") 
    try: 
     old_access_token = AccessToken.objects.get(user=user, application=application) 
     old_refresh_token = RefreshToken.objects.get(user=user, access_token=old_access_token) 
    except ObjectDoesNotExist: 
     return HttpResponse('Have not set any token') 
    else: 
     old_access_token.delete() 
     old_refresh_token.delete() 
    new_token = generate_token() 
    refresh_token = generate_token() 
    access_token=AccessToken.objects.create(user=user, application=app, expires=datetime.now() + timedelta(days=365),token=new_token) 
    RefreshToken.objects.create(user=user, application=app, token=refresh_token, access_token=access_token) 
    print('aceess',AccessToken) 
    return get_token_json(access_token) 

如何彌合DRF和oAuth2之間的差距,使登錄和用戶註冊功能?

回答

0

嘗試使用python社交身份驗證。

添加social.apps.django_app.defaultINSTALLED_APPS

添加social.backends.facebook.FacebookOAuth2AUTHENTICATION_BACKENDS

添加url(r'^auth/', include('social.apps.django_app.urls', namespace='social'))urls.py

但是,如果你在你的應用程序有會話認證,這將工作。如果您只想使用令牌,那麼可以添加一個管道來創建令牌併發送它或看一看https://github.com/PhilipGarnero/django-rest-framework-social-oauth2

+0

我希望用戶從移動應用程序登錄並註冊。所以我需要一個令牌。感謝您的回答。 – milan