2016-10-01 9 views
0

私はユーザーのログインとサインアップ機能を持つアプリケーションを構築しようとしています。
私はdjangoとDRFの両方からログインとサインアップを作成できますが、DRFを使って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

です0
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 authを試してみてください。アプリでセッション認証を持っている場合は、これは動作しますsocial.backends.facebook.FacebookOAuth2あなたurls.py

からurl(r'^auth/', include('social.apps.django_app.urls', namespace='social'))追加

AUTHENTICATION_BACKENDSに追加social.apps.django_app.default

INSTALLED_APPS

を追加します。トークンのみを使用する場合は、パイプを追加してトークンを作成して送信するか、または見てください https://github.com/PhilipGarnero/django-rest-framework-social-oauth2

+0

モバイルアプリからユーザーのログインと登録が必要です。だから私はトークン1が必要です。ご回答有難うございます。 – milan

関連する問題