“未提供身份验证凭据。”在 DRF 中

Posted

技术标签:

【中文标题】“未提供身份验证凭据。”在 DRF 中【英文标题】:"Authentication credentials were not provided." in DRF 【发布时间】:2019-08-09 12:55:50 【问题描述】:

我在我的 DRF 后端使用 rest_framework_simplejwt 身份验证。当我在身份验证和访问预定义的 API 端点方面使用 DRF 浏览器时,一切正常。

但是,当我想以编程方式访问 post/patch 方法的端点时,我得到 Authentication credentials are not provided. 错误。 这是我的设置:

ALLOWED_HOSTS = ['*']
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'propertypost.apps.PropertyConfig',
    'users.apps.UsersConfig',
    'rest_framework',

    # 3rd party
    'django_filters',
    'rest_auth',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'rest_auth.registration',
    'allauth.socialaccount',
    'django.contrib.gis',
]

REST_FRAMEWORK = 
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
        'rest_framework.filters.SearchFilter',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        # 'rest_framework.permissions.IsAuthenticated',
    ),



...

SIMPLE_JWT = 
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=525600),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=120),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),


AUTH_USER_MODEL = 'users.CustomUser'

REST_USE_JWT = True

正如我所说,上述设置在 DRF 浏览器中完美运行,但是当我尝试请求补丁方法时,它给出 身份验证凭据未提供

AUTH_ENDPOINT = "http://127.0.0.1:8000/rest-auth/login"
    
data = 
       'username': username,
        'password': password
headers = 
         "Content-Type": "application/json"
 
 r = requests.post(AUTH_ENDPOINT, data=json.dumps(data), headers=headers)
  token=r.json()['token']
 data = 
        'age': 8,
    
headers = 
    "Content-Type": "application/json",
    "Authorization": "JWT " + token,

    
r = requests.patch(POST_ENDPOINT, data=json.dumps(data), headers=headers)

【问题讨论】:

【参考方案1】:

来自Usage section,标头必须采用以下格式

"Authorization: <b>Bearer</b> YourToken"

所以,将标题更改为,

headers = 
    "Content-Type": "application/json",
    "Authorization": "Bearer " + token,

【讨论】:

以上是关于“未提供身份验证凭据。”在 DRF 中的主要内容,如果未能解决你的问题,请参考以下文章

DRF 总是返回“未提供身份验证凭据”

DRF:“详细信息”:“未提供身份验证凭据。”

Django Rest Framework JWT 未提供身份验证凭据

未提供 Angular + Django REST 身份验证凭据

djangorestframework-jwt 未提供身份验证凭据

POST 请求的身份验证错误:“未提供身份验证凭据”使用 Axios,但使用 POSTMAN 工作