【问题标题】:Getting authenticated user informations with Django Rest Framework, JWT and Vuejs使用 Django Rest Framework、JWT 和 Vuejs 获取经过身份验证的用户信息
【发布时间】:2019-06-25 11:19:21
【问题描述】:

我正在构建一个使用 DRF 作为后端并使用 Vuejs 作为前端的应用程序,我已经设法在 DRF 中使用 JWT 令牌创建了身份验证系统,但是我很难获得经过身份验证的用户信息。当我注册我存储的用户时,本地存储中的令牌为

localStorage.setItem('user-token', response.data.token)

但是当我尝试获取用户信息时,我会收到一个 401 禁止错误

detail: "Authentication credentials were not provided."

这是我的代码: 我用 axios 设置了这样的 header 授权

const token = localStorage.getItem('user-token') if (token) { axios.defaults.headers.common['Authorization'] =Basic ${token} }

vue中的get请求

 getUser(){
  axios.get(this.url +'/api/auth/user/')
  .then( (response) =>{
    console.log(response.data);
  });

我的意见.py

class UserViewSet(APIView):
permission_classes      = [permissions.IsAuthenticated]
def get(self, request):
    serializer = UserSerializer(request.user)
    return Response(serializer.data)

我的序列化器

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = User
    fields = ('username', )

当我删除权限类时,我会得到一个空的用户名字段作为响应,否则会出现前面提到的 401 错误。 我可以看到授权标头是在浏览器中发送的。 请问有什么解决办法吗?

我的设置.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#Third party
'webpack_loader',
'rest_framework',
'corsheaders',
#Local apps
'users',

]

MIDDLEWARE = [
'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',
#Cors
'corsheaders.middleware.CorsMiddleware',

]

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    #'rest_framework.authentication.BasicAuthentication',
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    'rest_framework.authentication.SessionAuthentication', #Oauth, JWT
),
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticatedOrReadOnly',
),
'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.SearchFilter',
        'rest_framework.filters.OrderingFilter',
),
'SEARCH_PARAM': 'q',
'ORDERING_PARAM': 'ordering',

}

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':
#'rest_framework_jwt.utils.jwt_response_payload_handler'
'users.api.utils.jwt_response_payload_handler',

'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

'JWT_AUTH_HEADER_PREFIX': 'JWT', # Authorization: JWT <token>
'JWT_AUTH_COOKIE': None,

}

#Cors
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

【问题讨论】:

    标签: vue.js django-rest-framework jwt axios django-rest-framework-jwt


    【解决方案1】:

    DRF 的默认授权标头是

    axios.defaults.headers.common['Authorization'] =JWT ${token}
    

    除非您没有进行更改,否则如果仍然无法正常工作,请提供设置文件代码。

    【讨论】:

    • 这实际上给了我一个错误(SyntaxError: Unexpected token, expected ;)。我把令牌 ${token} 放在``之间,它给了我同样的 401 未经授权的错误
    • 我添加了我的 settings.py
    • @AliKhiti 正如我看到的设置文件,您的身份验证令牌前缀是 JWT,所以添加 JWT 作为前缀而不是 BASIC。我已经添加了
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2014-06-07
    • 2013-05-03
    • 2017-05-13
    • 1970-01-01
    • 2020-04-10
    • 2015-06-01
    • 2014-10-03
    相关资源
    最近更新 更多