【问题标题】:When should token be generated using oAuth何时应使用 oAuth 生成令牌
【发布时间】:2017-01-13 23:16:58
【问题描述】:

我正在努力理解 oAuth2 以在我的 REST API 中实现。我在我的后端使用 DRF 并响应原生来构建移动应用程序。我可以在 DRF 中创建用户注册和登录,但我应该在何时何地实际创建一个令牌。我必须在用户注册或用户登录时创建令牌吗?我可能会得到反对票,但我知道一些专家会启发我。

用例是我有一个名为 foodie 的移动应用程序,用户可以在其中创建他们的帐户并登录。用户也可以从网络登录和创建帐户。

我应该在我的代码中实际在哪里实现 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)

【问题讨论】:

    标签: python django python-3.x oauth django-rest-framework


    【解决方案1】:

    可能,您应该问的问题是,当您尝试访问受保护的 URL/资源时,将一个简单的加密 cookie 传递给服务器是不够的。现在,如果您仍想生成令牌,那么在登录挂钩后,代码将在标头或响应有效负载中使用令牌进行响应。一旦令牌存在,您将 http 标头中的令牌作为 Authorization: Bearer 传递给资源服务器,该服务器处理令牌并提供访问权限。

    【讨论】:

    • 所以在 UserLoginAPI 中的 new_data = serializer.data 之后,如果 new_data:expire_seconds = oauth2_settings.user_settings['ACCESS_TOKEN_EXPIRE_SECONDS'] scopes = oauth2_settings.user_settings['SCOPES'] application = Application.objects,我应该这样做.get(name="Foodie") expires = datetime.now() + timedelta(seconds=expire_seconds) access_token = AccessToken.objects.create(user=new_data, application=application, token = generate_token(), expires=expires, scope =scopes) if access_token: 还是什么?
    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多