2016-09-06 6 views
0

私はREST APIに実装するoAuth2について理解しています。私はバックエンドでDRFを使用しており、モバイルアプリを構築するためにネイティブに反応します。 DRFでユーザー登録とログインを作成できますが、いつ、どこで実際にトークンを作成すればいいですか。ユーザー登録時またはユーザーログイン時にトークンを作成する必要がありますか?私は否定的な投票をするかもしれないが、私はいくつかの専門家が私を啓発するだろうと知っている。oAuthを使用してトークンを生成する必要がある場合

私は、ユーザーが自分のアカウントとログインを作成できるfoodieというモバイルアプリを持っています。ユーザーはWebからログインしてアカウントを作成することもできます。

実際に私のコードにoAuthトークンを実装する必要がありますか?

serializers.py

class UserCreateSerializer(ModelSerializer): 
    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): 
    # token = CharField(allow_blank=True, read_only=True) 
    username = CharField() 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      '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): 
     # access_token = AccessToken.objects.get(token=request.data.get('token'), expires__gt=timezone.now()) 
     data = request.data 
     serializer = UserLoginSerializer(data=data) 
     if serializer.is_valid(raise_exception=True): 
      new_data = serializer.data 
      return Response(new_data, status=status.HTTP_200_OK) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

答えて

0

おそらく、あなたが尋ねるべきである質問は簡単な暗号化されたCookieを使用すると、サーバに通過する十分ではありません保護されたURL /リソースにアクセスしようとするとさて、まだトークンを生成したいのであれば、ログインした後、ヘッダーまたは応答ペイロードのいずれかにトークンで応答するコードをフックしてください。トークンがあると、トークンを処理してアクセス権を与えるリソースサーバーに、httpヘッダーのトークンをAuthorization:Bearerとして渡します。

+0

のでNEW_DATA = serializer.data UserLoginAPIで後、私はNEW_DATA場合は、これを実行する必要があります。 \t \t expire_secondsの=のoauth2_settings.user_settings [ 'ACCESS_TOKEN_EXPIRE_SECONDS'] \t \tスコープ=のoauth2_settings.user_settings [ 'SCOPES'] \t \tアプリケーション= Application.objects.get(名前= "食通") \t \tは= datetime.now()+はtimedelta(秒=のexpire_seconds) \t \t access_tokenは= AccessToken.objects.create(ユーザー= NEW_DATA、 満了します\t \t \t \t \t \t \t \t \t \t \tアプリケーション=アプリケーション、 \t \t \t \t \t \t \t \t \t \t \t \tトークン= generate_token()、 \t \t \t \t \t \t \t \t \t \t \t \tは有効期限が切れる=有効期限が切れ、 \t \t \t \t \t \t \t \t \t \t \t \t範囲=スコープ)access_tokenは場合 \t \t: または何を? – Serenity

関連する問題