在我的项目中,我使用Django Rest Framework管理后端,使用React管理前端。
我目前正在实现身份验证系统,所以我刚刚将DEFAULT_PERMISSION_CLASSES
的REST_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中注销,然后重新登录。)*
有人知道我做错了什么吗
3条答案
按热度按时间balp4ylt1#
问题是我必须补充一点
到
REST_FRAMEWORK
设置,如此处所指定agxfikkp2#
我用谷歌chrome的“API测试器”来测试我的API,问题是我的管理门户是用同一个用户登录的,它阻止了我发送一个发布请求。我有身份验证类会话和令牌。
uxhixvfz3#
从Django Admin中注销,或者尝试使用Django Admin以外的用户登录。