2016-05-18 40 views
-2

我想允许django用户使用api网址中的密钥进行身份验证。 我还没有设置OAuth,所以我猜测密钥可能是一个sesion密钥或摘要密钥。 我有2个问题。 我试着发出这个请求:django1.8 api - 如何使用密钥进行身份验证

所有的
http://192.166.166.11:8000/api?task=search&term=115&csrf_token=s69WAIZqlCTur1XZQr72QhCc7fzqaRtM 

首先,我使用csrf_token尝试,但它不工作。 它把我带到登录页面。 其次,我不知道如何检索其他用户的csrf_token(管理员试图获取他们的csrf_tokens)。

我尝试:

x = User.objects.get(username='someone') 
x.get_session_auth_hash() 

给我的用户的身份验证哈希但它是一个不同的值。

有人能指导我解决这两个问题吗?

+0

什么?您为什么认为您需要其他用户的CSRF令牌,或者甚至认为CSRF令牌已分配给特定用户? –

回答

0

Django不提供开箱即用的API密钥。 使用API​​提供程序(如Tastypie)具有此功能

+0

谢谢,我会研究这个。 – max

1

您正在创建基于令牌的身份验证。您已经提到了OAUTH作为一种选择,我强烈建议使用django-oauth-toolkit之类的现有实现。但是,您也可以创建自己的快速解决方案来创建基于令牌的身份验证。

声明:这仅用于演示目的。不要将它复制到任何现有的项目中。它会使您的应用程序易受攻击。

首先,我们创建一个额外的模型处理身份验证令牌:

/auth_tokens/models.py

from django.db import models 
from django.conf import settings 

import string, random 

def random_string(length = 64, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits): 
    return ''.join(random.choice(chars) for x in range(length)) 

class AuthToken(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    token = models.CharField(max_length=64, default=random_string) 

/auth_tokens/middleware.py

from auth_tokens.models import AuthToken 

class AuthTokenMiddleware: 
    def process_request(self, request): 
     token = request.GET.get('auth', None) 
     if not token: 
      return 
     token = AuthToken.objects.get(token=token) 
     request.user = token.user 
     return request 

将中间件加入您的settings.MIDDLEWARE_CLASSES应该使您能够将?token=<token>添加到您的URL以登录您的用户。

0

我最终使用令牌认证: http://www.django-rest-framework.org/api-guide/authentication/

,所以我想分享的工作流程。

首先,您需要进行设置。在settings.py中,修改INSTALLED_APPS并像文档一样添加REST_FRAMEWORK。 然后你需要运行python manage.py syncdb,因为它需要添加一些表。 然后,您需要添加一些url到urls.py来路由api。 您可以创建并使用此代码检索标记:最后

from rest_framework.authtoken.models import Token 
token = Token.objects.create(user=User.objects.get(username='john')) 
print token.key 

,你就必须修改您的看法取决于您是否使用基于函数或基于类的视图。 这里是一个基于功能视图我用:

from rest_framework.authentication import TokenAuthentication 
from rest_framework.permissions import IsAuthenticated 
from rest_framework.response import Response 
from rest_framework.views import APIView 
from rest_framework.decorators import authentication_classes, permission_classes 
from rest_framework.decorators import api_view 

@api_view(['GET', 'POST']) 
@authentication_classes((TokenAuthentication,)) 
@permission_classes((IsAuthenticated,)) 
@login_required 
def mybooks(request): 
    entries = Book.objects.all() 
    return render(request, 'mybooks.html', {'entries': entries}) 

最后,测试一下:

import requests 
token = '243124c52f7583e320d043c4395bd99f63344035' 
headers = {'Authorization' : 'Token {}'.format(token)} 
page = requests.post('http://127.0.0.1:8000/mybooks/', headers=headers) 
print page.content 

注意,在我的情况,我不需要定义普通系列化,因为我有一个先进的自定义序列化这不是这里的主题。

相关问题