DjangoRest - 使用csrftoken的http请求返回user.isauthenticated()false

时间:2015-08-26 14:49:23

标签: django rest curl httprequest django-rest-framework

所以我有登录视图,效果很好并返回一个令牌。

@csrf_exempt
def login(request):
if request.method == 'POST':
    username = request.POST.get('username', None)
    password = request.POST.get('password', None)

    if username is not None and password is not None:
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                token, created = Token.objects.get_or_create(user=user)
                if not created:
                    created = datetime.datetime.now()
                return json_response({
                    'token': token.token,
                    'username': user.username
                })
            else:
                return json_response({
                    'error': 'Invalid User'
                }, status=400)
        else:
            return json_response({
                'error': 'Invalid Username/Password'
            }, status=400)
    else:
        return json_response({
            'error': 'Invalid Data'
        }, status=400)
elif request.method == 'OPTIONS':
    return json_response({})
else:
    return json_response({
        'error': 'Invalid Method'
    }, status=405)

卷曲线是:

curl -X POST -d "username=root&password=myPassword" http://localhost:80/api/login/

并且该行的结果很棒:

{"username": "root", "token": "3dfdcd6b2abeb432131c734f82a737505ee3110d"}

通过httprequest登录后,我想向服务器发送GET请求以获取视图。

我的观点示例

from django.contrib.auth.middleware import get_user
def list_orders(request):
   # check if authenticated else will exit
   if not get_user(request).is_authenticated():
    return ResponseError('authentication or permission failure')
   ...
   ...

此视图始终返回未经过身份验证的错误:(

我的http请求exmple:

curl http://localhost:80/orders/ -d "csfrmiddletoken=3dfdcd6b2abeb432131c734f82a737505ee3110d"

返回:

{"status": "failed", "details": "authentication or permission failure"}

不使用cookies对我来说非常重要!所以请不要建议在我的卷曲线上添加-b -c params。

如何使用登录视图中的令牌获取请求?

谢谢!

修改 我用2个STRps解决了这个问题: 一个我使用另一个函数来确保我得到一个令牌:

def token_required(func):
    def inner(request, *args, **kwargs):
        if request.method == 'OPTIONS':
            return func(request, *args, **kwargs)
        auth_header = request.META.get('HTTP_AUTHORIZATION', None)
        if auth_header is not None:
            tokens = auth_header.split(' ')
            if len(tokens) == 2 and tokens[0] == 'Token':
                token = tokens[1]
                try:
                    request.token = Token.objects.get(token=token)
                    return func(request, *args, **kwargs)
                except Token.DoesNotExist:
                    return json_response({
                        'error': 'Token not found'
                    }, status=401)
        return json_response({
            'error': 'Invalid Header'
        }, status=401)

    return inner

第二,我改变了我的httprequest:

 curl -X GET http://127.0.0.1:80/orders/ -H 'Authorization: Token 3dfdcd6b2abeb432131c734f82a737505ee3110d'

但是现在即使我通过网络界面登录到django并且我尝试访问该链接时出现错误,我没有有效的标题。 如何通过httprequest确保两种方式(Web界面)和令牌能够协同工作?

0 个答案:

没有答案