从django-rest-auth获取React中的用户详细信息返回403(禁止)-使用authtoken

roejwanj  于 2022-11-26  发布在  Go
关注(0)|答案(3)|浏览(173)

在我的项目中,我使用Django Rest Framework管理后端,使用React管理前端。
我目前正在实现身份验证系统,所以我刚刚将DEFAULT_PERMISSION_CLASSESREST_FRAMEWORK设置从rest_framework.permissions.AllowAny切换到rest_framework.authtoken(在一切正常工作之前)。
为了让事情更清楚,下面是我的settings.py(来自INSTALLED_APPS):

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Custom Apps
    'rest_framework',
    'assessments',
    'corsheaders',
    'accounts',
    'rest_framework.authtoken',
    'rest_auth',

    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'rest_auth.registration',

    'allauth.socialaccount'  # needed for delete user
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'api.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'api.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.AllowAny'
        'rest_framework.authtoken'
    ]
}

CORS_ORIGIN_ALLOW_ALL = True

REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'accounts.serializers.RegisterProfileSerializer',
}

REST_AUTH_SERIALIZERS = {
    'USER_DETAILS_SERIALIZER': 'accounts.serializers.UserProfileSerializer'
}

SITE_ID = 2

此外,为了使事情尽可能“安静”,我使用了django-rest-auth,以便使端点形成我的身份验证系统。
到目前为止,我已经成功实现了rest-auth/registration/rest-auth/users的API端点。同样,从API的Angular 来看,一切都正常。事实上,我能够用一个额外的字段注册用户,并正确地查看用户的详细信息。
我的问题是,当我试图通过React中的fetch函数发出GET请求时,我收到了一个GET http://127.0.0.1:8000/rest-auth/user/ 403 (Forbidden)
我以为这是由于令牌,所以经过一点搜索,我发现了这样的方式来使获取请求:

async getUserRole() {
    await fetch("http://127.0.0.1:8000/rest-auth/user/",
      {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': ' Token e68edf2d326bef3b12b3008c851261b0c7c3dced',
        }
      }
    )
      .then(response => response.json())
      .then(data => this.setState({ userRole: data.role }))
  }

如您所见,我正在为当前用户指定实际令牌,如管理页面中所示:

  • (我知道,从这张图片中,您可能会认为我试图在以admin身份登录时发出GET请求,因此令牌是不正确的,但实际上我是以用户mirko的身份从Django Rest Framework API中注销,然后重新登录。)*

有人知道我做错了什么吗

balp4ylt

balp4ylt1#

问题是我必须补充一点

DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ]

REST_FRAMEWORK设置,如此处所指定

agxfikkp

agxfikkp2#

我用谷歌chrome的“API测试器”来测试我的API,问题是我的管理门户是用同一个用户登录的,它阻止了我发送一个发布请求。我有身份验证类会话和令牌。

uxhixvfz

uxhixvfz3#

从Django Admin中注销,或者尝试使用Django Admin以外的用户登录。

相关问题