Django REST JSONWebTokenAuthentication + Angular(未提供授权详细信息)

时间:2018-10-06 17:45:11

标签: django angular django-rest-framework authorization django-rest-framework-jwt

几天来,我一直在努力使这种相当简单的身份验证设置能够正常工作。

我正在使用Django REST插件'django-rest-framework-jwt'进行JSON Web令牌认证。

对API进行卷曲处理时,它会按预期工作。

enter image description here

但是,当通过我的Angular应用程序发出请求时;我不断收到“未提供授权细节”详细信息的未授权错误。但是,在抓取请求时,可以清楚地看到它存在(请求中的令牌是有效的,因为我已经在CURL中使用了它:

enter image description here

我正在通过编写的拦截器注入身份验证标头;看起来像这样:

 intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const auth = this.session.authorization;

    if (!auth) {
      return next.handle(req);
    } else {
      const newReq = req.clone({
        setHeaders: {
          Authorization: auth,
        },
      });

      return next.handle(newReq);
    }
  }

此外,JWT_AUTH设置的设置定义如下:

JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',

    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',

    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'auth.views.jwt_response_payload_handler',

    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,

    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(seconds=3600),

    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
    'JWT_AUTH_COOKIE': None,
}

框架设置如下:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

对此有何建议?我不确定这是怎么回事。

编辑

“网络”标签中的请求/响应标题:

enter image description here

1 个答案:

答案 0 :(得分:0)

因此,最终它与Angular应用无关,但是服务器不接受CORS。通过以下文章中的说明对其进行修复:

https://www.techiediaries.com/django-cors/